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
1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.policy.PolicyManager;
206d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport com.android.internal.util.Preconditions;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
221abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganeshimport android.bluetooth.BluetoothAdapter;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
396d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
415be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo;
42756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
4474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager;
51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.SerialManager;
5225157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brownimport android.hardware.SystemSensorManager;
53fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.DisplayManager;
54ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.IInputManager;
559df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager;
56c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
57c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
58a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
63b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackbornimport android.media.MediaRouter;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
661a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager;
671a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager;
68c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
69c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager;
727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
7555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager;
7655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager;
7750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
80cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.os.Debug;
81f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
82539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
87258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager;
8875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
9175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
93f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
94c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.os.SystemVibrator;
95258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.UserManager;
96b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
989f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
101cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.util.Slog;
10298365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.CompatibilityInfoHolder;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
10498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.Display;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
10675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
108988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager;
109603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
110603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
11187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
112f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
113952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
13627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        if (receiver == null) {
13727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // Allow retrieving current sticky broadcast; this is safe since we
13827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // aren't actually registering a receiver.
13927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            return super.registerReceiver(null, filter, broadcastPermission, scheduler);
14027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        } else {
14127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            throw new ReceiverCallNotAllowedException(
14227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                    "BroadcastReceiver components are not allowed to register to receive intents");
14327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
14820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            IntentFilter filter, String broadcastPermission, Handler scheduler) {
14927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        if (receiver == null) {
15027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // Allow retrieving current sticky broadcast; this is safe since we
15127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            // aren't actually registering a receiver.
15227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler);
15327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        } else {
15427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey            throw new ReceiverCallNotAllowedException(
15527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                    "BroadcastReceiver components are not allowed to register to receive intents");
15627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        }
15720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    }
15820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn
15920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    @Override
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
16227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                "BroadcastReceiver components are not allowed to bind to services");
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1672155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1682155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1702155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
172569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
174333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
175333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1786c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    private String mBasePackageName;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
187a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    private Display mDisplay; // may be null if default display
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
189870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
1906d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    private UserHandle mUser;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
198805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    private File mObbDir;
199e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
200e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
2015f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ALARM_SERVICE, new StaticServiceFetcher() {
306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AlarmManager(service);
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
317b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn        registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() {
318b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                public Object createService(ContextImpl ctx) {
319b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                    return new MediaRouter(ctx);
320b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                }});
321b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn
3221abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh        registerService(BLUETOOTH_SERVICE, new ServiceFetcher() {
3231abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                public Object createService(ContextImpl ctx) {
3241abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                    return BluetoothAdapter.getDefaultAdapter();
3251abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                }});
3261abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
332224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
355d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly        registerService(NFC_SERVICE, new ServiceFetcher() {
356d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                public Object createService(ContextImpl ctx) {
357d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                    return new NfcManager(ctx);
358d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                }});
359d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly
360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        registerService(INPUT_SERVICE, new StaticServiceFetcher() {
3669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                public Object createStaticService() {
3679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                    return InputManager.getInstance();
368ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown                }});
3699df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
370bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        registerService(DISPLAY_SERVICE, new ServiceFetcher() {
371bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                @Override
372bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                public Object createService(ContextImpl ctx) {
373bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    return new DisplayManager(ctx.getOuterContext());
374bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }});
375fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return InputMethodManager.getInstance(ctx);
379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
381988323c57bd25a58f05dfa492d9b9c8ab62c5153satok        registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
382988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                public Object createService(ContextImpl ctx) {
383988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                    return TextServicesManager.getInstance();
384988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                }});
385988323c57bd25a58f05dfa492d9b9c8ab62c5153satok
386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
400e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly        registerService(LOCATION_SERVICE, new ServiceFetcher() {
401e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly                public Object createService(ContextImpl ctx) {
402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
403e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly                    return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4061a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
4071a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            @Override
4081a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            public Object createService(ContextImpl ctx) {
4091a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
4101a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                        ServiceManager.getService(NETWORK_POLICY_SERVICE)));
4111a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            }
4121a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        });
4131a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
419d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                Resources.selectSystemTheme(0,
420d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        outerContext.getApplicationInfo().targetSdkVersion,
421d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Dialog,
4226e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_Holo_Dialog,
4236e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        registerService(NSD_SERVICE, new ServiceFetcher() {
4287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                @Override
4297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                public Object createService(ContextImpl ctx) {
4307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    IBinder b = ServiceManager.getService(NSD_SERVICE);
4317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    INsdManager service = INsdManager.Stub.asInterface(b);
43222af38c5261d2c03796b496e6edb125327cace16Irfan Sheriff                    return new NsdManager(ctx.getOuterContext(), service);
4337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                }});
4347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
435224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
436224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
437224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
438224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
439224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
4429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    return new PowerManager(ctx.getOuterContext(),
4439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                            service, ctx.mMainThread.getHandler());
444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
445224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
446224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
447224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
448224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
449224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
450224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
451224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
452224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
453224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
45425157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brown                    return new SystemSensorManager(ctx.mMainThread.getHandler().getLooper());
455224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
456224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
457224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
458224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
459224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
460224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
463224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
464224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
465224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return new StorageManager(ctx.mMainThread.getHandler().getLooper());
466224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
467224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
468224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
469224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
470224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
471224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
472224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
473224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
474224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
475224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
476224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
477224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
481224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
482224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
483224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
485224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
486224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
487224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4883a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        registerService(USB_SERVICE, new ServiceFetcher() {
4893a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                public Object createService(ContextImpl ctx) {
490e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                    IBinder b = ServiceManager.getService(USB_SERVICE);
4913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
492e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                }});
493e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
494b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        registerService(SERIAL_SERVICE, new ServiceFetcher() {
495b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                public Object createService(ContextImpl ctx) {
496b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    IBinder b = ServiceManager.getService(SERIAL_SERVICE);
497b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
498b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                }});
499b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
500224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
501224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
502c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown                    return new SystemVibrator();
503224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
504224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
505224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
506224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
507224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WIFI_SERVICE, new ServiceFetcher() {
508224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
509224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
510224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IWifiManager service = IWifiManager.Stub.asInterface(b);
51188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    return new WifiManager(ctx.getOuterContext(), service);
512224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
513224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
51455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
51555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                public Object createService(ContextImpl ctx) {
51655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
51755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
51855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    return new WifiP2pManager(service);
51955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                }});
52055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
521224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WINDOW_SERVICE, new ServiceFetcher() {
522224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
523a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    Display display = ctx.mDisplay;
524a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    if (display == null) {
525a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                        DisplayManager dm = (DisplayManager)ctx.getOuterContext().getSystemService(
526a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                                Context.DISPLAY_SERVICE);
527a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                        display = dm.getDisplay(Display.DEFAULT_DISPLAY);
528a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    }
529a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    return new WindowManagerImpl(display);
530224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
531258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
532258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        registerService(USER_SERVICE, new ServiceFetcher() {
533258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            public Object getService(ContextImpl ctx) {
534258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                IBinder b = ServiceManager.getService(USER_SERVICE);
535258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                IUserManager service = IUserManager.Stub.asInterface(b);
536258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                return new UserManager(ctx, service);
537258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            }});
538224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
539224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
5405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static ContextImpl getImpl(Context context) {
5415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Context nextContext;
5425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        while ((context instanceof ContextWrapper) &&
5435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
5445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            context = nextContext;
5455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
5465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return (ContextImpl)context;
5475fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
5485fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
549224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // The system service cache for the system services that are
550224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // cached per-ContextImpl.  Package-scoped to avoid accessor
551224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // methods.
552224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
553224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
556756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        return getResources().getAssets();
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
591eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
592eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5945f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5995f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
601247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    public int getThemeResId() {
602247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn        return mThemeResource;
603247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    }
604247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn
605247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    @Override
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
608d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
609d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                    getOuterContext().getApplicationInfo().targetSdkVersion);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6315c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
6325c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
6335c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
6345c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
6355c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
6365c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
6375c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
6385c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6535f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
65423ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
65523ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
65623ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
65723ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
662333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
6636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
6644cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                File prefsFile = getSharedPrefsFile(name);
6654cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode);
6666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
6676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
6686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6704e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
6714e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
6724e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // If somebody else (some other process) changed the prefs
6734e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // file behind our back, we reload it.  This has been the
6744e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // historical (if undocumented) behavior.
6754e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            sp.startReloadIfChangedUnexpectedly();
6764e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        }
6776194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
7335f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7445f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
746e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
747e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
748e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
749e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
750e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
751e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
752e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
753e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
754e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
755e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
756e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
757e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
758e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
759e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
760e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
761e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
762e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
763e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
764e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
765e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
766e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
767e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
768e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
769e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
770e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
771e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
772e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
773e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
774e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
775e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7765f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
777e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
778805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    public File getObbDir() {
779805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        synchronized (mSync) {
780805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            if (mObbDir == null) {
781805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                mObbDir = Environment.getExternalStorageAppObbDirectory(
782805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                        getPackageName());
783805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            }
784805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            return mObbDir;
785805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        }
786805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    }
787805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
788805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    @Override
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
79692d570529c72c00ab456521a5b0237f62a6abdf5Amith Yamasani                    Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath());
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8075f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
808e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
809e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
810e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
811e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
812e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
813e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
814e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
815e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
816e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
817e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
818e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
819e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
820e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
821e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
822e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
823e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
824e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
825e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
826e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
827e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
828e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
8295f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
84347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        return openOrCreateDatabase(name, mode, factory, null);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
84774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
84874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
84974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
85047847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
85147847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
85247847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown            flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
85347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        }
85447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
85574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
85674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
85774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
85874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
85974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
862a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
86379087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown            return SQLiteDatabase.deleteDatabase(f);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
871a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8805f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8925f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
8954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8998cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
9004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
9058cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
9108cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
9154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
9204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
9258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
930cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
931a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
932a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
933a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
9348264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    /** @hide */
9358264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    @Override
93679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void startActivityAsUser(Intent intent, UserHandle user) {
937f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        startActivityAsUser(intent, null, user);
9388264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    }
9398264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani
940a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
941a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
942cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
9506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
951a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intent, -1, options);
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
954258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /** @hide */
955258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    @Override
95679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
957258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
958258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            ActivityManagerNative.getDefault().startActivityAsUser(
959258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                mMainThread.getApplicationThread(), intent,
960258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani                intent.resolveTypeIfNeeded(getContentResolver()),
96179af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options,
96279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                user.getIdentifier());
963258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
964258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
965258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
966258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
968621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
969cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
970a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivities(intents, null);
971a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
972a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
973ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    /** @hide */
974ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    @Override
975ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
976ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
977ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            throw new AndroidRuntimeException(
978ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                    "Calling startActivities() from outside of an Activity "
979ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
980ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                    + " Is this really what you want?");
981ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        }
982ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        mMainThread.getInstrumentation().execStartActivitiesAsUser(
983ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            getOuterContext(), mMainThread.getApplicationThread(), null,
984ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            (Activity)null, intents, options, userHandle.getIdentifier());
985ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    }
986ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani
987a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
988a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents, Bundle options) {
989cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
990621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
991621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new AndroidRuntimeException(
992621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    "Calling startActivities() from outside of an Activity "
993621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
994621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " Is this really what you want?");
995621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
996621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mMainThread.getInstrumentation().execStartActivities(
997621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
998a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intents, options);
999621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
1000621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
1001621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
1002fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
1003fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1004fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
1005a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
1006a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
1007a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
1008a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
1009a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSender(IntentSender intent, Intent fillInIntent,
1010a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int flagsMask, int flagsValues, int extraFlags, Bundle options)
1011a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
1012fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
1013fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
1014fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
10159ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                fillInIntent.setAllowFds(false);
1016fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
1017fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
1018fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
1019fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
1020fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
1021a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        0, flagsMask, flagsValues, options);
1022a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (result == ActivityManager.START_CANCELED) {
1023fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
1024fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
1025fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
1026fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
1027fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
1028fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
10295f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1030fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
1032cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10359ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1038742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, false,
1039ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104467cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    @Override
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
1046cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10499ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1052742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, false, false,
1053ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
1061cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10649ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1067742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, true, false,
1068ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
1078cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
109201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10989ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
1102ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                true, false, getUserId());
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
110879af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
11097d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        try {
11117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            intent.setAllowFds(false);
11127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
11137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    intent, resolvedType, null, Activity.RESULT_OK, null, null, null, false, false,
111479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                    user.getIdentifier());
11157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        } catch (RemoteException e) {
11167d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
11177d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
11187d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
11197d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    @Override
11205ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void sendBroadcastAsUser(Intent intent, UserHandle user,
11215ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            String receiverPermission) {
11225ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11235ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
11245ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent.setAllowFds(false);
11255ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
11265ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, null,
11275ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                Activity.RESULT_OK, null, null, receiverPermission, false, false,
11285ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                user.getIdentifier());
11295ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
11305ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
11315ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
11325ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
11335ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
113479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
11355ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
11367d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            int initialCode, String initialData, Bundle initialExtras) {
11377d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        IIntentReceiver rd = null;
11387d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (resultReceiver != null) {
11397d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if (mPackageInfo != null) {
11407d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (scheduler == null) {
11417d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    scheduler = mMainThread.getHandler();
11427d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
11437d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
11447d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
11457d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    mMainThread.getInstrumentation(), false);
11467d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            } else {
11477d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (scheduler == null) {
11487d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    scheduler = mMainThread.getHandler();
11497d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
11507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
11517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
11527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
11537d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
11547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        try {
11567d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            intent.setAllowFds(false);
11577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
11587d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
11595ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                initialCode, initialData, initialExtras, receiverPermission,
116079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                true, false, user.getIdentifier());
11617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        } catch (RemoteException e) {
11627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
11637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
11647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
11657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    @Override
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
1167cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11709ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1173742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, true,
1174ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                getUserId());
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1180efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
1181efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
1182efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
1183efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
1184cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1185efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
1186efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
1187efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
1188efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1189efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1190efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
1191efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
1192efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
1193efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
1194efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
1195efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1196efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1197efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
119801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1199efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1200efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
1201efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1202efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1203efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
12049ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
1205efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
1206efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1207efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
1208ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                true, true, getUserId());
1209efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
1210efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1211efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
1212efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
1213efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12219ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
1223ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                    mMainThread.getApplicationThread(), intent, getUserId());
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12295ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
12305ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12315ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
12325ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent.setAllowFds(false);
12335ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
12345ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, null,
12355ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                Activity.RESULT_OK, null, null, null, false, true, user.getIdentifier());
12365ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
12375ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
12385ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
12395ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
12405ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
12415ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void sendStickyOrderedBroadcastAsUser(Intent intent,
12425ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            UserHandle user, BroadcastReceiver resultReceiver,
12435ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            Handler scheduler, int initialCode, String initialData,
12445ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            Bundle initialExtras) {
12455ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        IIntentReceiver rd = null;
12465ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        if (resultReceiver != null) {
12475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            if (mPackageInfo != null) {
12485ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                if (scheduler == null) {
12495ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    scheduler = mMainThread.getHandler();
12505ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                }
12515ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
12525ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
12535ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    mMainThread.getInstrumentation(), false);
12545ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            } else {
12555ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                if (scheduler == null) {
12565ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    scheduler = mMainThread.getHandler();
12575ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                }
12585ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
12595ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
12605ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            }
12615ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
12625ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12635ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
12645ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent.setAllowFds(false);
12655ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
12665ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
12675ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                initialCode, initialData, initialExtras, null,
12685ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                true, true, user.getIdentifier());
12695ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
12705ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
12715ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
12725ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
12735ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
12745ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
12755ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
12765ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        if (resolvedType != null) {
12775ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent = new Intent(intent);
12785ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent.setDataAndType(intent.getData(), resolvedType);
12795ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
12805ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        try {
12815ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            intent.setAllowFds(false);
12825ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            ActivityManagerNative.getDefault().unbroadcastIntent(
12835ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    mMainThread.getApplicationThread(), intent, user.getIdentifier());
12845ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        } catch (RemoteException e) {
12855ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        }
12865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    }
12875ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn
12885ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn    @Override
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1296ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return registerReceiverInternal(receiver, getUserId(),
129720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                filter, broadcastPermission, scheduler, getOuterContext());
129820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    }
129920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn
130020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    @Override
130120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
130220e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            IntentFilter filter, String broadcastPermission, Handler scheduler) {
130320e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn        return registerReceiverInternal(receiver, user.getIdentifier(),
130420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                filter, broadcastPermission, scheduler, getOuterContext());
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
130720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn    private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
132301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1324399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
13296c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                    mMainThread.getApplicationThread(), mBasePackageName,
133020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    rd, filter, broadcastPermission, userId);
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
1352cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1353ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return startServiceAsUser(service, mUser);
13547767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
13557767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
13567767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    @Override
13577767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public boolean stopService(Intent service) {
1358cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1359ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return stopServiceAsUser(service, mUser);
13607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
13617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
13627767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    @Override
13637767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public ComponentName startServiceAsUser(Intent service, UserHandle user) {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13659ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
13687767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1369c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            if (cn != null) {
1370c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (cn.getPackageName().equals("!")) {
1371c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    throw new SecurityException(
1372c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            "Not allowed to start service " + service
1373c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            + " without permission " + cn.getClassName());
1374c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                } else if (cn.getPackageName().equals("!!")) {
1375c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    throw new SecurityException(
1376c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            "Unable to start service " + service
1377c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                            + ": " + cn.getClassName());
1378c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13877767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public boolean stopServiceAsUser(Intent service, UserHandle user) {
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13899ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
13927767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
1406cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        warnIfCallingFromSystemProcess();
1407f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        return bindService(service, conn, flags, UserHandle.getUserId(Process.myUid()));
140837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
140937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
141037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    /** @hide */
141137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    @Override
14127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    public boolean bindService(Intent service, ServiceConnection conn, int flags, int userHandle) {
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
141479b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        if (conn == null) {
141579b3317b775810bac088b0998c48eb6506e2578cChristopher Tate            throw new IllegalArgumentException("connection is null");
141679b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        }
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1424c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            IBinder token = getActivityToken();
1425c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1426c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    && mPackageInfo.getApplicationInfo().targetSdkVersion
1427c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1428c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                flags |= BIND_WAIVE_PRIORITY;
1429c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
14309ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
14347d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                sd, flags, userHandle);
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
144779b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        if (conn == null) {
144879b3317b775810bac088b0998c48eb6506e2578cChristopher Tate            throw new IllegalArgumentException("connection is null");
144979b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        }
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14669ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            if (arguments != null) {
14679ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                arguments.setAllowFds(false);
14689ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
1470ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                    className, profileFile, 0, arguments, null, getUserId());
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14838cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1487438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1488438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1489438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1490ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1491ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1492ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1493ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1494ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1495ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1496ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1497438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1498438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1499438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
1522742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return checkPermission(permission, pid, Binder.getCallingUid());
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
15454dc7a68dbeaa0edd8815b2105915753310d58343Christopher Tate                     : "uid " + uid + " does not have ") +
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1626569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
1690742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                false,
1691742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getCallingUid(), uri, message);
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1715cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani    private void warnIfCallingFromSystemProcess() {
1716cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        if (Process.myUid() == Process.SYSTEM_UID) {
1717cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani            Slog.w(TAG, "Calling a method in the system process without a qualified user: "
1718cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani                    + Debug.getCallers(3));
1719cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani        }
1720cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani    }
1721cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
17246d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            throws NameNotFoundException {
172564442c11555d828a41af0b8a58ab933357889061Amith Yamasani        return createPackageContextAsUser(packageName, flags,
172664442c11555d828a41af0b8a58ab933357889061Amith Yamasani                mUser != null ? mUser : Process.myUserHandle());
17276d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    }
17286d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey
17296d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    @Override
17306d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
17316d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            throws NameNotFoundException {
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
1733816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
17346f2a3d298205522f2e799800dace0e6c345dd4d3Adam Powell            context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
17356f2a3d298205522f2e799800dace0e6c345dd4d3Adam Powell            context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user);
1736816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            return context;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
173901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
174098edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags,
174198edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani                    user.getIdentifier());
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
17432155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1744870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
17456d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            c.init(pi, null, mMainThread, mResources, mBasePackageName, user);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1756870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1757756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    public Context createConfigurationContext(Configuration overrideConfiguration) {
1758a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        if (overrideConfiguration == null) {
1759a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown            throw new IllegalArgumentException("overrideConfiguration must not be null");
1760a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        }
1761a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1762756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        ContextImpl c = new ContextImpl();
1763756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        c.init(mPackageInfo, null, mMainThread);
1764756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        c.mResources = mMainThread.getTopLevelResources(
1765a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                mPackageInfo.getResDir(),
1766a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                getDisplayId(), overrideConfiguration,
1767756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                mResources.getCompatibilityInfo());
1768756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        return c;
1769756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    }
1770756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn
1771756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    @Override
1772a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    public Context createDisplayContext(Display display) {
1773a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        if (display == null) {
1774a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown            throw new IllegalArgumentException("display must not be null");
1775a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        }
1776a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1777a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        int displayId = display.getDisplayId();
1778a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        CompatibilityInfo ci = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
1779a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        CompatibilityInfoHolder cih = getCompatibilityInfo(displayId);
1780a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        if (cih != null) {
1781a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown            ci = cih.get();
1782a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        }
1783a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1784a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        ContextImpl context = new ContextImpl();
1785a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        context.init(mPackageInfo, null, mMainThread);
1786a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        context.mDisplay = display;
1787a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        context.mResources = mMainThread.getTopLevelResources(
1788a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                mPackageInfo.getResDir(), displayId, null, ci);
1789a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        return context;
1790a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    }
1791a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1792a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    private int getDisplayId() {
1793a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
1794a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    }
1795a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown
1796a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    @Override
1797870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1798870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1799870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1800870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
180198365d7663cbd82979a5700faf0050220b01084dJeff Brown    @Override
1802a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown    public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
1803a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
180498365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
180598365d7663cbd82979a5700faf0050220b01084dJeff Brown
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1825ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey    /** {@hide} */
1826ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey    public int getUserId() {
1827ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return mUser.getIdentifier();
1828ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey    }
1829ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey
18302155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
18316d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        final ContextImpl context = new ContextImpl();
18326d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        context.init(Resources.getSystem(), mainThread, Process.myUserHandle());
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18362155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18462155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
18486c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = context.mBasePackageName;
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
18526d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mUser = context.mUser;
1853a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown        mDisplay = context.mDisplay;
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18576d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
18586d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
1859ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1860ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
18616d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
18626d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            Resources container, String basePackageName, UserHandle user) {
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
18646c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1866ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1867559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1868559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1869559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1870ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1871ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1872ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1873ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1874ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1875a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
1876a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    null, container.getCompatibilityInfo());
1877ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
1879756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        mActivityToken = activityToken;
18806d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mContentResolver = new ApplicationContentResolver(this, mainThread, user);
18816d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mUser = user;
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18846d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    final void init(Resources resources, ActivityThread mainThread, UserHandle user) {
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
18866c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = null;
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
18896d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mContentResolver = new ApplicationContentResolver(this, mainThread, user);
18906d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        mUser = user;
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19125f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19165f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1921d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1932569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1940a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1941a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1942a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1943a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1944a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1945a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1946a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1947a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1948a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1949a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1950a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1951a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1952a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1953a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1954a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1955a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1956a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1957a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1958a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1959a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1960a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1961a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1967a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
19756d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        private final ActivityThread mMainThread;
19766d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        private final UserHandle mUser;
19776d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey
19786d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        public ApplicationContentResolver(
19796d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey                Context context, ActivityThread mainThread, UserHandle user) {
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
19816d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            mMainThread = Preconditions.checkNotNull(mainThread);
19826d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            mUser = Preconditions.checkNotNull(user);
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19866d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        protected IContentProvider acquireProvider(Context context, String auth) {
19876d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            return mMainThread.acquireProvider(context, auth, mUser.getIdentifier(), true);
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19916d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        protected IContentProvider acquireExistingProvider(Context context, String auth) {
19926d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            return mMainThread.acquireExistingProvider(context, auth, mUser.getIdentifier(), true);
1993cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1994cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1995cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1996cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
19976ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(provider, true);
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19995f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2000652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
20016d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        protected IContentProvider acquireUnstableProvider(Context c, String auth) {
20026d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            return mMainThread.acquireProvider(c, auth, mUser.getIdentifier(), false);
2003652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
2004652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn
2005652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
2006652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        public boolean releaseUnstableProvider(IContentProvider icp) {
20076ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(icp, false);
20086ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
20096ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn
20106ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        @Override
20116ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        public void unstableProviderDied(IContentProvider icp) {
20126ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
2013652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2016