19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackbornimport android.os.Build;
2075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.policy.PolicyManager;
216d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport com.android.internal.util.Preconditions;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport android.bluetooth.BluetoothManager;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
406d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
425be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo;
43756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
4574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
5051e95df8f24e9ea30775686b9e324b9a671213dcErik Gillingimport android.hardware.ConsumerIrManager;
51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager;
52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.SerialManager;
5325157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brownimport android.hardware.SystemSensorManager;
542f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.CameraManager;
55fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.DisplayManager;
569df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager;
57c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
58c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
60a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
64b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackbornimport android.media.MediaRouter;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
671a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager;
681a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager;
717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
7455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager;
7555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager;
7650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
79cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.os.Debug;
80f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
81539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
86258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager;
8775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
9075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
92f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
93c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.os.SystemVibrator;
94258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.UserManager;
952d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkeyimport android.os.storage.IMountService;
96b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.print.IPrintManager;
984b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.print.PrintManager;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
1009f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
1028e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkeyimport android.util.ArrayMap;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
104cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.util.Slog;
10548d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautnerimport android.view.DisplayAdjustments;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
10798365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.Display;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
10975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
11069ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viveretteimport android.view.accessibility.CaptioningManager;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
112988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager;
113603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
114603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
11587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
116a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
1171abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkeyimport com.android.internal.annotations.GuardedBy;
118a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService;
119f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
120952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
14327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        if (receiver == null) {
14427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // Allow retrieving current sticky broadcast; this is safe since we
14527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // aren't actually registering a receiver.
14627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            return super.registerReceiver(null, filter, broadcastPermission, scheduler);
14727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        } else {
14827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            throw new ReceiverCallNotAllowedException(
14927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                    "BroadcastReceiver components are not allowed to register to receive intents");
15027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
15520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            IntentFilter filter, String broadcastPermission, Handler scheduler) {
15627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        if (receiver == null) {
15727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // Allow retrieving current sticky broadcast; this is safe since we
15827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // aren't actually registering a receiver.
15927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler);
16027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        } else {
16127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            throw new ReceiverCallNotAllowedException(
16227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                    "BroadcastReceiver components are not allowed to register to receive intents");
16327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        }
16420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    }
16520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn
16620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    @Override
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
16927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                "BroadcastReceiver components are not allowed to bind to services");
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1742155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1752155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1772155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
17840e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn    private final static String TAG = "ContextImpl";
179569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1818e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey    /**
1828e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey     * Map from package name, to preference name, to cached preferences.
1838e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey     */
1848e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey    private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1876c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    private String mBasePackageName;
18895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    private String mOpPackageName;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
197a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    private Display mDisplay; // may be null if default display
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
199870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
2006d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    private UserHandle mUser;
20188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    private ResourcesManager mResourcesManager;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2051abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
2071abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
2091abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
2111abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
2131abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
2141abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2151abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    private File[] mExternalObbDirs;
2161abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2171abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    private File[] mExternalFilesDirs;
2181abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @GuardedBy("mSync")
2191abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    private File[] mExternalCacheDirs;
2205f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments();
22448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
31469ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette        registerService(CAPTIONING_SERVICE, new ServiceFetcher() {
31569ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette                public Object getService(ContextImpl ctx) {
31669ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette                    return new CaptioningManager(ctx);
31769ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette                }});
31869ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette
319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
331e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        registerService(ALARM_SERVICE, new ServiceFetcher() {
332e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate                public Object createService(ContextImpl ctx) {
333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
335e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate                    return new AlarmManager(service, ctx);
336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
343b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn        registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() {
344b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                public Object createService(ContextImpl ctx) {
345b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                    return new MediaRouter(ctx);
346b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                }});
347b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn
3481abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh        registerService(BLUETOOTH_SERVICE, new ServiceFetcher() {
3491abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                public Object createService(ContextImpl ctx) {
350ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie                    return new BluetoothManager(ctx);
3511abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                }});
3521abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
359224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
367224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
368224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
369224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
370224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
381d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly        registerService(NFC_SERVICE, new ServiceFetcher() {
382d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                public Object createService(ContextImpl ctx) {
383d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                    return new NfcManager(ctx);
384d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                }});
385d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly
386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        registerService(INPUT_SERVICE, new StaticServiceFetcher() {
3929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                public Object createStaticService() {
3939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                    return InputManager.getInstance();
394ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown                }});
3959df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
396bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        registerService(DISPLAY_SERVICE, new ServiceFetcher() {
397bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                @Override
398bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                public Object createService(ContextImpl ctx) {
399bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    return new DisplayManager(ctx.getOuterContext());
400bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }});
401fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
402f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown        registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() {
403f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown                public Object createStaticService() {
404f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown                    return InputMethodManager.getInstance();
405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
406224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
407988323c57bd25a58f05dfa492d9b9c8ab62c5153satok        registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
408988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                public Object createService(ContextImpl ctx) {
409988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                    return TextServicesManager.getInstance();
410988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                }});
411988323c57bd25a58f05dfa492d9b9c8ab62c5153satok
412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
426e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly        registerService(LOCATION_SERVICE, new ServiceFetcher() {
427e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly                public Object createService(ContextImpl ctx) {
428224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
429e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly                    return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4321a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
4331a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            @Override
4341a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            public Object createService(ContextImpl ctx) {
4351a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
4361a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                        ServiceManager.getService(NETWORK_POLICY_SERVICE)));
4371a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            }
4381a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        });
4391a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
445d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                Resources.selectSystemTheme(0,
446d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        outerContext.getApplicationInfo().targetSdkVersion,
447d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Dialog,
4486e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_Holo_Dialog,
4496e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
450224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
451224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
452224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        registerService(NSD_SERVICE, new ServiceFetcher() {
4547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                @Override
4557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                public Object createService(ContextImpl ctx) {
4567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    IBinder b = ServiceManager.getService(NSD_SERVICE);
4577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    INsdManager service = INsdManager.Stub.asInterface(b);
45822af38c5261d2c03796b496e6edb125327cace16Irfan Sheriff                    return new NsdManager(ctx.getOuterContext(), service);
4597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                }});
4607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
463224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
464224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
465224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
466224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
467224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
4689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    return new PowerManager(ctx.getOuterContext(),
4699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                            service, ctx.mMainThread.getHandler());
470224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
471224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
472224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
473224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
474224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
475224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
476224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
477224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
4806d0c1d78f121d4f1b72973740e8b120c7def1dc0Jaikumar Ganesh                    return new SystemSensorManager(ctx.getOuterContext(),
4816d0c1d78f121d4f1b72973740e8b120c7def1dc0Jaikumar Ganesh                      ctx.mMainThread.getHandler().getLooper());
482224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
483224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
485224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
486224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
487224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
488224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
489224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
490224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
491224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
492be72215c39916af9ae42332260c04b696bc73d7fJeff Sharkey                        return new StorageManager(
493be72215c39916af9ae42332260c04b696bc73d7fJeff Sharkey                                ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper());
494224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
495224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
496224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
497224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
498224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
499224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
500224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
501224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
502224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
503224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
504224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
505224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
506224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
507224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
508224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
509224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
5103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        registerService(USB_SERVICE, new ServiceFetcher() {
5113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                public Object createService(ContextImpl ctx) {
512e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                    IBinder b = ServiceManager.getService(USB_SERVICE);
5133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
514e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                }});
515e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
516b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        registerService(SERIAL_SERVICE, new ServiceFetcher() {
517b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                public Object createService(ContextImpl ctx) {
518b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    IBinder b = ServiceManager.getService(SERIAL_SERVICE);
519b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
520b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                }});
521b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
522224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
523224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
524a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                    return new SystemVibrator(ctx);
525224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
526224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
527224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
528224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
529224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WIFI_SERVICE, new ServiceFetcher() {
530224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
531224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
532224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IWifiManager service = IWifiManager.Stub.asInterface(b);
53388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    return new WifiManager(ctx.getOuterContext(), service);
534224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
535224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
53655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
53755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                public Object createService(ContextImpl ctx) {
53855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
53955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
54055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    return new WifiP2pManager(service);
54155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                }});
54255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
543224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WINDOW_SERVICE, new ServiceFetcher() {
544e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                Display mDefaultDisplay;
545224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
546a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    Display display = ctx.mDisplay;
547a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    if (display == null) {
548e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                        if (mDefaultDisplay == null) {
549e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                            DisplayManager dm = (DisplayManager)ctx.getOuterContext().
550e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                                    getSystemService(Context.DISPLAY_SERVICE);
551e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                            mDefaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY);
552e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                        }
553e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy                        display = mDefaultDisplay;
554a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    }
555a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    return new WindowManagerImpl(display);
556224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
557258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
558258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        registerService(USER_SERVICE, new ServiceFetcher() {
559a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            public Object createService(ContextImpl ctx) {
560258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                IBinder b = ServiceManager.getService(USER_SERVICE);
561258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                IUserManager service = IUserManager.Stub.asInterface(b);
562258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                return new UserManager(ctx, service);
563258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            }});
564a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
565a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        registerService(APP_OPS_SERVICE, new ServiceFetcher() {
566a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            public Object createService(ContextImpl ctx) {
567a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                IBinder b = ServiceManager.getService(APP_OPS_SERVICE);
568a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                IAppOpsService service = IAppOpsService.Stub.asInterface(b);
569a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                return new AppOpsManager(ctx, service);
570a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }});
571b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
572e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin        registerService(CAMERA_SERVICE, new ServiceFetcher() {
573e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin            public Object createService(ContextImpl ctx) {
574e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin                return new CameraManager(ctx);
5754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            }
5764b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        });
5774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
5784b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        registerService(PRINT_SERVICE, new ServiceFetcher() {
5794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            public Object createService(ContextImpl ctx) {
5804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                IBinder iBinder = ServiceManager.getService(Context.PRINT_SERVICE);
5814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                IPrintManager service = IPrintManager.Stub.asInterface(iBinder);
5824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(),
5834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                        UserHandle.getAppId(Process.myUid()));
584b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            }});
58551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
58651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling        registerService(CONSUMER_IR_SERVICE, new ServiceFetcher() {
58751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling            public Object createService(ContextImpl ctx) {
58851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling                return new ConsumerIrManager(ctx);
58951e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling            }});
590224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
591224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
5925fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static ContextImpl getImpl(Context context) {
5935fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Context nextContext;
5945fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        while ((context instanceof ContextWrapper) &&
5955fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
5965fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            context = nextContext;
5975fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
5985fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return (ContextImpl)context;
5995fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
6005fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
601224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // The system service cache for the system services that are
602224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // cached per-ContextImpl.  Package-scoped to avoid accessor
603224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // methods.
604224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
605224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
608756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        return getResources().getAssets();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6405f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
643eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
644eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6465f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6515f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
653247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    public int getThemeResId() {
654247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn        return mThemeResource;
655247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    }
656247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn
657247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    @Override
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
660d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
661d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                    getOuterContext().getApplicationInfo().targetSdkVersion);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        // No mPackageInfo means this is a Context for the system itself,
68035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        // and this here is its name.
68135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return "android";
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
684d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn    /** @hide */
685d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn    @Override
686d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn    public String getBasePackageName() {
687d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        return mBasePackageName != null ? mBasePackageName : getPackageName();
688d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn    }
689d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn
69095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    /** @hide */
69195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    @Override
69295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    public String getOpPackageName() {
69395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        return mOpPackageName != null ? mOpPackageName : getBasePackageName();
69495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    }
69595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6975c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
6985c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
6995c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
7005c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
7015c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
7025c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
7035c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
7045c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7195f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
72023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
72123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
72223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
72323ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
727f6913597247dfbfc0a1c387c976ec9004cb1cccbDianne Hackborn        synchronized (ContextImpl.class) {
7288e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            if (sSharedPrefs == null) {
7298e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey                sSharedPrefs = new ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>();
7308e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            }
7318e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey
7328e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            final String packageName = getPackageName();
7338e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            ArrayMap<String, SharedPreferencesImpl> packagePrefs = sSharedPrefs.get(packageName);
7348e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            if (packagePrefs == null) {
7358e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey                packagePrefs = new ArrayMap<String, SharedPreferencesImpl>();
7368e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey                sSharedPrefs.put(packageName, packagePrefs);
7378e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            }
7388e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey
739ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn            // At least one application in the world actually passes in a null
740ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn            // name.  This happened to work because when we generated the file name
741ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn            // we would stringify it to "null.xml".  Nice.
742ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn            if (mPackageInfo.getApplicationInfo().targetSdkVersion <
743e8222dddaf2e3da14380101e818d4254899e0c0dChet Haase                    Build.VERSION_CODES.KITKAT) {
744ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn                if (name == null) {
745ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn                    name = "null";
746ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn                }
747ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn            }
748ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn
7498e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey            sp = packagePrefs.get(name);
7506194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
7514cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                File prefsFile = getSharedPrefsFile(name);
7524cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode);
7538e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey                packagePrefs.put(name, sp);
7546194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
7556194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7574e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
7584e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
7594e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // If somebody else (some other process) changed the prefs
7604e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // file behind our back, we reload it.  This has been the
7614e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // historical (if undocumented) behavior.
7624e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            sp.startReloadIfChangedUnexpectedly();
7634e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        }
7646194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
820cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                    if (mFilesDir.exists()) {
821cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        // spurious failure; probably racing with another process for this app
822cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        return mFilesDir;
823cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                    }
8245f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8355f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
837e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
8381abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        // Operates on primary external storage
8391abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        return getExternalFilesDirs(type)[0];
8401abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    }
8411abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
8421abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @Override
8431abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    public File[] getExternalFilesDirs(String type) {
844e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
8451abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            if (mExternalFilesDirs == null) {
8461abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey                mExternalFilesDirs = Environment.buildExternalStorageAppFilesDirs(getPackageName());
847e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
8481abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
8491abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            // Splice in requested type, if any
8501abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            File[] dirs = mExternalFilesDirs;
8511abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            if (type != null) {
8521abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey                dirs = Environment.buildPaths(dirs, type);
853e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
8541abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
8551abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            // Create dirs if needed
8561abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            return ensureDirsExistOrFilter(dirs);
857e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
858e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
8595f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
860e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
861805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    public File getObbDir() {
8621abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        // Operates on primary external storage
8631abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        return getObbDirs()[0];
8641abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    }
8651abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
8661abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @Override
8671abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    public File[] getObbDirs() {
868805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        synchronized (mSync) {
8691abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            if (mExternalObbDirs == null) {
8701abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey                mExternalObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName());
871805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            }
8722d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey
8732d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey            // Create dirs if needed
8742d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey            return ensureDirsExistOrFilter(mExternalObbDirs);
875805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        }
876805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    }
877805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
878805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    @Override
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
886cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                    if (mCacheDir.exists()) {
887cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        // spurious failure; probably racing with another process for this app
888cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        return mCacheDir;
889cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                    }
89092d570529c72c00ab456521a5b0237f62a6abdf5Amith Yamasani                    Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath());
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9015f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
902e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
903e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
9041abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        // Operates on primary external storage
9051abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        return getExternalCacheDirs()[0];
9061abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    }
9071abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
9081abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    @Override
9091abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    public File[] getExternalCacheDirs() {
910e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
9111abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            if (mExternalCacheDirs == null) {
9121abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey                mExternalCacheDirs = Environment.buildExternalStorageAppCacheDirs(getPackageName());
913e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
9141abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
9151abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            // Create dirs if needed
9161abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            return ensureDirsExistOrFilter(mExternalCacheDirs);
917e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
918e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
9195f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
93347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        return openOrCreateDatabase(name, mode, factory, null);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
93774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
93874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
93974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
94047847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
94147847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
94247847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown            flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
94347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        }
94447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
94574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
94674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
94774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
94874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
94974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
952a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
95379087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown            return SQLiteDatabase.deleteDatabase(f);
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
961a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9705f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9825f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
9854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9898cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
9904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
9958cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
10008cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
10054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
10104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
10158cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
1020cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1021a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
1022a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
1023a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
10248264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    /** @hide */
10258264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    @Override
102679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void startActivityAsUser(Intent intent, UserHandle user) {
1027f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        startActivityAsUser(intent, null, user);
10288264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    }
10298264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani
1030a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
1031a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
1032cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
10406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
1041a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intent, -1, options);
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1044258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /** @hide */
1045258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    @Override
104679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
1047258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
1048258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            ActivityManagerNative.getDefault().startActivityAsUser(
1049f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn                mMainThread.getApplicationThread(), getBasePackageName(), intent,
1050258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                intent.resolveTypeIfNeeded(getContentResolver()),
105179af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options,
105279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                user.getIdentifier());
1053258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
1054258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
1055258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
1056258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1058621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
1059cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1060a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivities(intents, null);
1061a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
1062a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
1063ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    /** @hide */
1064ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    @Override
1065ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
1066ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1067ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            throw new AndroidRuntimeException(
1068ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                    "Calling startActivities() from outside of an Activity "
1069ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
1070ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                    + " Is this really what you want?");
1071ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        }
1072ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        mMainThread.getInstrumentation().execStartActivitiesAsUser(
1073ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            getOuterContext(), mMainThread.getApplicationThread(), null,
1074ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            (Activity)null, intents, options, userHandle.getIdentifier());
1075ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    }
1076ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani
1077a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
1078a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents, Bundle options) {
1079cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1080621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1081621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new AndroidRuntimeException(
1082621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    "Calling startActivities() from outside of an Activity "
1083621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
1084621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " Is this really what you want?");
1085621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
1086621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mMainThread.getInstrumentation().execStartActivities(
1087621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
1088a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intents, options);
1089621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
1090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
1091621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
1092fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
1093fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1094fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
1095a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
1096a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
1097a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
1098a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
1099a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSender(IntentSender intent, Intent fillInIntent,
1100a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int flagsMask, int flagsValues, int extraFlags, Bundle options)
1101a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
1102fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
1103fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
1104fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
1105a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey                fillInIntent.migrateExtraStreamToClipData();
1106a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey                fillInIntent.prepareToLeaveProcess();
1107fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
1108fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
1109fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
1110fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
1111fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
1112a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        0, flagsMask, flagsValues, options);
1113a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (result == ActivityManager.START_CANCELED) {
1114fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
1115fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
1116fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
1117fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
1118fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
1119fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
11205f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1121fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
1123cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1126a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1129f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false,
1130ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
113567cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    @Override
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
1137cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1140a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1143f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE,
1144f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                false, false, getUserId());
1145f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        } catch (RemoteException e) {
1146f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        }
1147f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    }
1148f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn
1149f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    @Override
1150f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1151f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        warnIfCallingFromSystemProcess();
1152f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1153f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        try {
1154a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
1155f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
1156f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, null,
1157f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
1158ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
1166cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1169a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1172f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false,
1173ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
1183f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE,
1184f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                resultReceiver, scheduler, initialCode, initialData, initialExtras);
1185f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    }
1186f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn
1187f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    @Override
1188f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public void sendOrderedBroadcast(Intent intent,
1189f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1190f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            Handler scheduler, int initialCode, String initialData,
1191f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            Bundle initialExtras) {
1192cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
120601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1212a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1215f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                initialCode, initialData, initialExtras, receiverPermission, appOp,
1216f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    true, false, getUserId());
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
122279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
12237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12247d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        try {
1225a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
12267d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
1227f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    intent, resolvedType, null, Activity.RESULT_OK, null, null, null,
1228f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    AppOpsManager.OP_NONE, false, false, user.getIdentifier());
12297d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        } catch (RemoteException e) {
12307d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
12317d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
12327d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
12337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    @Override
12345ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void sendBroadcastAsUser(Intent intent, UserHandle user,
12355ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            String receiverPermission) {
12365ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12375ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
1238a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
12395ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
12405ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, null,
1241f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false,
12425ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                user.getIdentifier());
12435ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
12445ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
12455ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
12465ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
12475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
124879af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
12495ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
12507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            int initialCode, String initialData, Bundle initialExtras) {
12517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        IIntentReceiver rd = null;
12527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (resultReceiver != null) {
12537d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if (mPackageInfo != null) {
12547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (scheduler == null) {
12557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    scheduler = mMainThread.getHandler();
12567d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
12577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
12587d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
12597d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    mMainThread.getInstrumentation(), false);
12607d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            } else {
12617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (scheduler == null) {
12627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    scheduler = mMainThread.getHandler();
12637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
12647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
12657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
12667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
12677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
12687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        try {
1270a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
12717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
12727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
12735ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                initialCode, initialData, initialExtras, receiverPermission,
1274f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    AppOpsManager.OP_NONE, true, false, user.getIdentifier());
12757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        } catch (RemoteException e) {
12767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
12777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
12787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
12797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    @Override
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
1281cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1284a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1287f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true,
1288ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1294efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
1295efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
1296efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
1297efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
1298cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1299efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
1300efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
1301efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
1302efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1303efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1304efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
1305efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
1306efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
1307efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
1308efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
1309efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1310efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1311efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
131201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1313efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1314efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
1315efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1316efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1317efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
1318a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
1319efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
1320efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1321efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
1322f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    AppOpsManager.OP_NONE, true, true, getUserId());
1323efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
1324efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1325efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
1326efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
1327efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1335a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
1337ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                    mMainThread.getApplicationThread(), intent, getUserId());
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13435ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
13445ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
13455ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
1346a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
13475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
13485ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, null,
1349f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier());
13505ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
13515ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
13525ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
13535ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
13545ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
13555ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void sendStickyOrderedBroadcastAsUser(Intent intent,
13565ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            UserHandle user, BroadcastReceiver resultReceiver,
13575ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            Handler scheduler, int initialCode, String initialData,
13585ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            Bundle initialExtras) {
13595ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        IIntentReceiver rd = null;
13605ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        if (resultReceiver != null) {
13615ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            if (mPackageInfo != null) {
13625ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                if (scheduler == null) {
13635ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    scheduler = mMainThread.getHandler();
13645ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                }
13655ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
13665ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
13675ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    mMainThread.getInstrumentation(), false);
13685ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            } else {
13695ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                if (scheduler == null) {
13705ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    scheduler = mMainThread.getHandler();
13715ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                }
13725ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
13735ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
13745ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            }
13755ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
13765ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
13775ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
1378a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
13795ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
13805ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
13815ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                initialCode, initialData, initialExtras, null,
1382f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    AppOpsManager.OP_NONE, true, true, user.getIdentifier());
13835ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
13845ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
13855ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
13865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
13875ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
13885ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
13895ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
13905ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        if (resolvedType != null) {
13915ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent = new Intent(intent);
13925ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent.setDataAndType(intent.getData(), resolvedType);
13935ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
13945ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
1395a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
13965ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().unbroadcastIntent(
13975ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    mMainThread.getApplicationThread(), intent, user.getIdentifier());
13985ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
13995ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
14005ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
14015ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
14025ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1410ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return registerReceiverInternal(receiver, getUserId(),
141120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                filter, broadcastPermission, scheduler, getOuterContext());
141220e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    }
141320e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn
141420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    @Override
141520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
141620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            IntentFilter filter, String broadcastPermission, Handler scheduler) {
141720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn        return registerReceiverInternal(receiver, user.getIdentifier(),
141820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                filter, broadcastPermission, scheduler, getOuterContext());
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
142120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
143701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1438399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
14436c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                    mMainThread.getApplicationThread(), mBasePackageName,
144420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    rd, filter, broadcastPermission, userId);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1464fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    private void validateServiceIntent(Intent service) {
1465fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        if (service.getComponent() == null && service.getPackage() == null) {
1466fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn            if (true || getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KITKAT) {
1467fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn                Log.w(TAG, "Implicit intents with startService are not safe: " + service
1468fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn                        + " " + Debug.getCallers(2, 3));
1469fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn                //IllegalArgumentException ex = new IllegalArgumentException(
1470fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn                //        "Service Intent must be explicit: " + service);
1471fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn                //Log.e(TAG, "This will become an error", ex);
1472fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn                //throw ex;
1473fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn            }
1474fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        }
1475fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    }
1476fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
1479cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1480fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        return startServiceCommon(service, mUser);
14817767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
14827767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
14837767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    @Override
14847767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public boolean stopService(Intent service) {
1485cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1486fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        return stopServiceCommon(service, mUser);
14877767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
14887767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
14897767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    @Override
14907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public ComponentName startServiceAsUser(Intent service, UserHandle user) {
1491fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        return startServiceCommon(service, user);
1492fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    }
1493fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn
1494fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    private ComponentName startServiceCommon(Intent service, UserHandle user) {
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1496fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn            validateServiceIntent(service);
1497a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            service.prepareToLeaveProcess();
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
15007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1501c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            if (cn != null) {
1502c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (cn.getPackageName().equals("!")) {
1503c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    throw new SecurityException(
1504c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            "Not allowed to start service " + service
1505c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            + " without permission " + cn.getClassName());
1506c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                } else if (cn.getPackageName().equals("!!")) {
1507c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    throw new SecurityException(
1508c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            "Unable to start service " + service
1509c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            + ": " + cn.getClassName());
1510c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15197767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public boolean stopServiceAsUser(Intent service, UserHandle user) {
1520fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        return stopServiceCommon(service, user);
1521fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    }
1522fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn
1523fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    private boolean stopServiceCommon(Intent service, UserHandle user) {
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1525fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn            validateServiceIntent(service);
1526a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            service.prepareToLeaveProcess();
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
15297767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
1543cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1544fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        return bindServiceCommon(service, conn, flags, Process.myUserHandle());
154537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
154637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
154737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    /** @hide */
154837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    @Override
154927b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani    public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
155027b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani            UserHandle user) {
1551fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        return bindServiceCommon(service, conn, flags, user);
1552fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    }
1553fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn
1554fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn    private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
1555fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn            UserHandle user) {
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
155779b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        if (conn == null) {
155879b3317b775810bac088b0998c48eb6506e2578cChristopher Tate            throw new IllegalArgumentException("connection is null");
155979b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        }
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1566fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn        validateServiceIntent(service);
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1568c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            IBinder token = getActivityToken();
1569c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1570c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    && mPackageInfo.getApplicationInfo().targetSdkVersion
1571c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1572c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                flags |= BIND_WAIVE_PRIORITY;
1573c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
1574a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            service.prepareToLeaveProcess();
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
157827b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani                sd, flags, user.getIdentifier());
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
159179b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        if (conn == null) {
159279b3317b775810bac088b0998c48eb6506e2578cChristopher Tate            throw new IllegalArgumentException("connection is null");
159379b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        }
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16109ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            if (arguments != null) {
16119ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                arguments.setAllowFds(false);
16129ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            }
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
161480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov                    className, profileFile, 0, arguments, null, null, getUserId());
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1623224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1624224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16278cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1628224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1631438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1632438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1633438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1634ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1635ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1636ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1637ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1638ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1639ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1640ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1641438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1642438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1643438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
1666742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return checkPermission(permission, pid, Binder.getCallingUid());
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
16894dc7a68dbeaa0edd8815b2105915753310d58343Christopher Tate                     : "uid " + uid + " does not have ") +
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1770569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
1834742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                false,
1835742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getCallingUid(), uri, message);
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill    /**
1860365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill     * Logs a warning if the system process directly called a method such as
1861365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill     * {@link #startService(Intent)} instead of {@link #startServiceAsUser(Intent, UserHandle)}.
1862365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill     * The "AsUser" variants allow us to properly enforce the user's restrictions.
1863365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill     */
1864cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani    private void warnIfCallingFromSystemProcess() {
1865cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        if (Process.myUid() == Process.SYSTEM_UID) {
1866cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani            Slog.w(TAG, "Calling a method in the system process without a qualified user: "
186740e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn                    + Debug.getCallers(5));
1868cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        }
1869cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani    }
1870cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
18736d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            throws NameNotFoundException {
187464442c11555d828a41af0b8a58ab933357889061Amith Yamasani        return createPackageContextAsUser(packageName, flags,
187564442c11555d828a41af0b8a58ab933357889061Amith Yamasani                mUser != null ? mUser : Process.myUserHandle());
18766d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    }
18776d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey
18786d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    @Override
18796d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
18806d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            throws NameNotFoundException {
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
1882816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
18836f2a3d298205522f2e799800dace0e6c345dd4d3Adam Powell            context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
18846f2a3d298205522f2e799800dace0e6c345dd4d3Adam Powell            context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user);
1885816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            return context;
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
188801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
188998edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags,
189098edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani                    user.getIdentifier());
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
18922155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1893870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
18946d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            c.init(pi, null, mMainThread, mResources, mBasePackageName, user);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1905870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1906756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    public Context createConfigurationContext(Configuration overrideConfiguration) {
1907a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        if (overrideConfiguration == null) {
1908a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown            throw new IllegalArgumentException("overrideConfiguration must not be null");
1909a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        }
1910a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1911756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        ContextImpl c = new ContextImpl();
1912756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        c.init(mPackageInfo, null, mMainThread);
191388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        c.mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(),
191488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo(),
191588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                mActivityToken);
1916756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        return c;
1917756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    }
1918756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn
1919756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    @Override
1920a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    public Context createDisplayContext(Display display) {
1921a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        if (display == null) {
1922a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown            throw new IllegalArgumentException("display must not be null");
1923a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        }
1924a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1925a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        int displayId = display.getDisplayId();
1926a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1927a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        ContextImpl context = new ContextImpl();
1928a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        context.init(mPackageInfo, null, mMainThread);
1929a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        context.mDisplay = display;
193048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        DisplayAdjustments daj = getDisplayAdjustments(displayId);
193188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        context.mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(),
193288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                displayId, null, daj.getCompatibilityInfo(), null);
1933a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        return context;
1934a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    }
1935a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1936a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    private int getDisplayId() {
1937a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
1938a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    }
1939a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1940a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    @Override
1941870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1942870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1943870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1944870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
194598365d7663cbd82979a5700faf0050220b01084dJeff Brown    @Override
194648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public DisplayAdjustments getDisplayAdjustments(int displayId) {
194748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        return mDisplayAdjustments;
194898365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
194998365d7663cbd82979a5700faf0050220b01084dJeff Brown
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey    /** {@hide} */
1970ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey    public int getUserId() {
1971ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return mUser.getIdentifier();
1972ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey    }
1973ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey
19742155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
19756d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        final ContextImpl context = new ContextImpl();
19766d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        context.init(Resources.getSystem(), mainThread, Process.myUserHandle());
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19802155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19902155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
19926c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = context.mBasePackageName;
199395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        mOpPackageName = context.mOpPackageName;
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
19976d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mUser = context.mUser;
1998a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        mDisplay = context.mDisplay;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
200048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo());
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20036d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
20046d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
2005ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
2006ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
20076d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
20086d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            Resources container, String basePackageName, UserHandle user) {
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
201095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        if (basePackageName != null) {
201195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            mBasePackageName = mOpPackageName = basePackageName;
201295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        } else {
201395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            mBasePackageName = packageInfo.mPackageName;
201495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            ApplicationInfo ainfo = packageInfo.getApplicationInfo();
201595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            if (ainfo.uid == Process.SYSTEM_UID && ainfo.uid != Process.myUid()) {
201695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                // Special case: system components allow themselves to be loaded in to other
201795d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                // processes.  For purposes of app ops, we must then consider the context as
201895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                // belonging to the package of this process, not the system itself, otherwise
201995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                // the package+uid verifications in app ops will fail.
202095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                mOpPackageName = ActivityThread.currentPackageName();
202195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            } else {
202295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                mOpPackageName = mBasePackageName;
202395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            }
202495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        }
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
202688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        mResourcesManager = ResourcesManager.getInstance();
2027ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
202848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        CompatibilityInfo compatInfo =
202948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                container == null ? null : container.getCompatibilityInfo();
203048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        if (mResources != null &&
203148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                ((compatInfo != null && compatInfo.applicationScale !=
203248d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                        mResources.getCompatibilityInfo().applicationScale)
203348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                || activityToken != null)) {
2034ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
2035ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
2036ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
2037ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
203848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            if (compatInfo == null) {
2039bd6a6e6019231621644e1701b6a95093abc40333Craig Mautner                compatInfo = packageInfo.getCompatibilityInfo();
204048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            }
204148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            mDisplayAdjustments.setCompatibilityInfo(compatInfo);
204248d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            mDisplayAdjustments.setActivityToken(activityToken);
204388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(),
204448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                    Display.DEFAULT_DISPLAY, null, compatInfo, activityToken);
204548d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        } else {
204648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo());
204748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            mDisplayAdjustments.setActivityToken(activityToken);
2048ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
2050756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        mActivityToken = activityToken;
20516d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mContentResolver = new ApplicationContentResolver(this, mainThread, user);
20526d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mUser = user;
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20556d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    final void init(Resources resources, ActivityThread mainThread, UserHandle user) {
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
20576c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = null;
205895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        mOpPackageName = null;
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
20616d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mContentResolver = new ApplicationContentResolver(this, mainThread, user);
20626d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mUser = user;
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20845f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2093d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2104569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2111a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
2112a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
2113a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
2114a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
2115a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
2116a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
2117a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
2118a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
2119a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
2120a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
2121a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
2122a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
2123a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
2124a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
2125a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
2126a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
2127a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
2128a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
2129a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
2130a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
2131a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
2132a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
2133a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
2139a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21421abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    /**
21431abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey     * Ensure that given directories exist, trying to create them if missing. If
21441abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey     * unable to create, they are filtered by replacing with {@code null}.
21451abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey     */
21462d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey    private File[] ensureDirsExistOrFilter(File[] dirs) {
21471abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        File[] result = new File[dirs.length];
21481abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        for (int i = 0; i < dirs.length; i++) {
21491abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            File dir = dirs[i];
21501abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            if (!dir.exists()) {
21511abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey                if (!dir.mkdirs()) {
2152cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                    // recheck existence in case of cross-process race
2153cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                    if (!dir.exists()) {
2154cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        // Failing to mkdir() may be okay, since we might not have
2155cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        // enough permissions; ask vold to create on our behalf.
2156cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        final IMountService mount = IMountService.Stub.asInterface(
2157cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                                ServiceManager.getService("mount"));
2158cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        int res = -1;
2159cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        try {
2160cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                            res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
2161cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        } catch (RemoteException e) {
2162cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        }
2163cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        if (res != 0) {
2164cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                            Log.w(TAG, "Failed to ensure directory: " + dir);
2165cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                            dir = null;
2166cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate                        }
21672d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    }
21681abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey                }
21691abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            }
21701abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey            result[i] = dir;
21711abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        }
21721abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey        return result;
21731abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey    }
21741abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
21806d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        private final ActivityThread mMainThread;
21816d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        private final UserHandle mUser;
21826d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey
21836d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        public ApplicationContentResolver(
21846d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey                Context context, ActivityThread mainThread, UserHandle user) {
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
21866d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            mMainThread = Preconditions.checkNotNull(mainThread);
21876d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            mUser = Preconditions.checkNotNull(user);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
21916d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        protected IContentProvider acquireProvider(Context context, String auth) {
21926d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            return mMainThread.acquireProvider(context, auth, mUser.getIdentifier(), true);
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
21966d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        protected IContentProvider acquireExistingProvider(Context context, String auth) {
21976d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            return mMainThread.acquireExistingProvider(context, auth, mUser.getIdentifier(), true);
2198cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
2199cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
2200cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
2201cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
22026ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(provider, true);
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22045f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2205652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
22066d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        protected IContentProvider acquireUnstableProvider(Context c, String auth) {
22076d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            return mMainThread.acquireProvider(c, auth, mUser.getIdentifier(), false);
2208652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
2209652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn
2210652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
2211652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        public boolean releaseUnstableProvider(IContentProvider icp) {
22126ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(icp, false);
22136ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
22146ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn
22156ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        @Override
22166ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        public void unstableProviderDied(IContentProvider icp) {
22176ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
2218652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
22197aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey
22207aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey        @Override
22217aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey        public void appNotRespondingViaProvider(IContentProvider icp) {
22227aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            mMainThread.appNotRespondingViaProvider(icp.asBinder());
22237aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey        }
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2226