ContextImpl.java revision 2d1ee982276f5dbd0e035778b731b48e4ef34515
1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (C) 2006 The Android Open Source Project
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Licensed under the Apache License, Version 2.0 (the "License");
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * you may not use this file except in compliance with the License.
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * You may obtain a copy of the License at
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *      http://www.apache.org/licenses/LICENSE-2.0
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Unless required by applicable law or agreed to in writing, software
1191037db265ecdd914a26e056cf69207b4f50924ehkuang * distributed under the License is distributed on an "AS IS" BASIS,
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1391037db265ecdd914a26e056cf69207b4f50924ehkuang * See the License for the specific language governing permissions and
1491037db265ecdd914a26e056cf69207b4f50924ehkuang * limitations under the License.
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
1691037db265ecdd914a26e056cf69207b4f50924ehkuang
1791037db265ecdd914a26e056cf69207b4f50924ehkuangpackage android.app;
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1991037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.app.usage.IUsageStatsManager;
2091037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.app.usage.UsageStatsManager;
2191037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.appwidget.AppWidgetManager;
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.os.Build;
23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.service.persistentdata.IPersistentDataBlockService;
2591037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.service.persistentdata.PersistentDataBlockManager;
2691037db265ecdd914a26e056cf69207b4f50924ehkuangimport com.android.internal.appwidget.IAppWidgetService;
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport com.android.internal.policy.PolicyManager;
2891037db265ecdd914a26e056cf69207b4f50924ehkuangimport com.android.internal.util.Preconditions;
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.bluetooth.BluetoothManager;
315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.BroadcastReceiver;
325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.ComponentName;
335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.ContentProvider;
345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.ContentResolver;
355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.Context;
365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.ContextWrapper;
375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.IContentProvider;
385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.Intent;
395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.IntentFilter;
405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.IIntentReceiver;
415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.IntentSender;
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.IRestrictionsManager;
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.ReceiverCallNotAllowedException;
445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.RestrictionsManager;
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.ServiceConnection;
465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.SharedPreferences;
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.pm.ApplicationInfo;
48f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangimport android.content.pm.ILauncherApps;
499b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.content.pm.IPackageManager;
50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.content.pm.LauncherApps;
51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.content.pm.PackageManager;
525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.content.pm.PackageManager.NameNotFoundException;
539b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.content.res.AssetManager;
549b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.content.res.CompatibilityInfo;
559b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.content.res.Configuration;
5691037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.content.res.Resources;
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.database.DatabaseErrorHandler;
5891037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.database.sqlite.SQLiteDatabase;
59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.database.sqlite.SQLiteDatabase.CursorFactory;
6091037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.graphics.Bitmap;
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.graphics.drawable.Drawable;
6291037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.hardware.ConsumerIrManager;
639b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.hardware.ISerialManager;
64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.hardware.SerialManager;
659b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.hardware.SystemSensorManager;
666ac915abcdb404a00d927fe6308a47fcf09d9519hkuangimport android.hardware.hdmi.HdmiControlManager;
679b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.hardware.hdmi.IHdmiControlService;
6891037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.hardware.camera2.CameraManager;
699b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.hardware.display.DisplayManager;
7091037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.hardware.input.InputManager;
7191037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.hardware.usb.IUsbManager;
7291037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.hardware.usb.UsbManager;
735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.location.CountryDetector;
749b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.location.ICountryDetector;
756ac915abcdb404a00d927fe6308a47fcf09d9519hkuangimport android.location.ILocationManager;
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.location.LocationManager;
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.media.AudioManager;
789b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.media.MediaRouter;
799b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.media.projection.MediaProjectionManager;
809b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.media.session.MediaSessionManager;
819b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.media.tv.ITvInputManager;
829b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.media.tv.TvInputManager;
839b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.net.ConnectivityManager;
849b35249446b07f40ac5fcc3205f2c048616efacchkuangimport android.net.IConnectivityManager;
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.EthernetManager;
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.IEthernetManager;
871184aebb761cbeac9124c37189a80a1a58f04b6bhkuangimport android.net.INetworkPolicyManager;
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.NetworkPolicyManager;
8991037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.net.NetworkScoreManager;
905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.net.Uri;
915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.net.nsd.INsdManager;
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.nsd.NsdManager;
9391037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.net.wifi.IWifiManager;
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.wifi.WifiManager;
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.wifi.p2p.IWifiP2pManager;
9691037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.net.wifi.p2p.WifiP2pManager;
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.net.wifi.IWifiScanner;
9891037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.net.wifi.WifiScanner;
9991037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.net.wifi.IRttManager;
10091037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.net.wifi.RttManager;
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.nfc.NfcManager;
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.os.BatteryManager;
1035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.os.Binder;
1045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.os.Bundle;
10591037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.Debug;
1065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.os.DropBoxManager;
1076ac915abcdb404a00d927fe6308a47fcf09d9519hkuangimport android.os.Environment;
10891037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.FileUtils;
10991037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.Handler;
11091037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.IBinder;
11191037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.IPowerManager;
11291037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.IUserManager;
11391037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.Looper;
11491037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.PowerManager;
115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.os.Process;
11691037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.RemoteException;
1175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.os.ServiceManager;
11891037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.UserHandle;
11991037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.SystemVibrator;
12091037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.os.UserManager;
1215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.os.storage.IMountService;
1225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport android.os.storage.StorageManager;
1231184aebb761cbeac9124c37189a80a1a58f04b6bhkuangimport android.print.IPrintManager;
1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuangimport android.print.PrintManager;
125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.service.fingerprint.IFingerprintService;
126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.service.fingerprint.FingerprintManager;
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.telecom.TelecomManager;
12891037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.telephony.TelephonyManager;
12991037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.content.ClipboardManager;
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.util.AndroidRuntimeException;
131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.util.ArrayMap;
132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.util.Log;
13391037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.util.Slog;
134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.view.DisplayAdjustments;
13591037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.view.ContextThemeWrapper;
13691037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.view.Display;
1371184aebb761cbeac9124c37189a80a1a58f04b6bhkuangimport android.view.WindowManagerImpl;
138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.view.accessibility.AccessibilityManager;
139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.view.accessibility.CaptioningManager;
140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport android.view.inputmethod.InputMethodManager;
14191037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.view.textservice.TextServicesManager;
14291037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.accounts.AccountManager;
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport android.accounts.IAccountManager;
14491037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.app.admin.DevicePolicyManager;
14591037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.app.job.IJobScheduler;
14691037db265ecdd914a26e056cf69207b4f50924ehkuangimport android.app.trust.TrustManager;
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport com.android.internal.annotations.GuardedBy;
149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport com.android.internal.app.IAppOpsService;
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport com.android.internal.os.IDropBoxManagerService;
1515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport java.io.File;
153b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport java.io.FileInputStream;
154b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport java.io.FileNotFoundException;
1555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport java.io.FileOutputStream;
156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianimport java.io.IOException;
1575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangimport java.io.InputStream;
158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangimport java.util.ArrayList;
15991037db265ecdd914a26e056cf69207b4f50924ehkuangimport java.util.HashMap;
160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ReceiverRestrictedContext extends ContextWrapper {
1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ReceiverRestrictedContext(Context base) {
163f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        super(base);
1646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    }
165b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    @Override
1676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
168b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        return registerReceiver(receiver, filter, null, null);
169a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    }
17091037db265ecdd914a26e056cf69207b4f50924ehkuang
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    @Override
172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            String broadcastPermission, Handler scheduler) {
17491037db265ecdd914a26e056cf69207b4f50924ehkuang        if (receiver == null) {
175f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang            // Allow retrieving current sticky broadcast; this is safe since we
17691037db265ecdd914a26e056cf69207b4f50924ehkuang            // aren't actually registering a receiver.
177a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            return super.registerReceiver(null, filter, broadcastPermission, scheduler);
178a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        } else {
179a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            throw new ReceiverCallNotAllowedException(
180a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                    "BroadcastReceiver components are not allowed to register to receive intents");
181a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        }
182a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    }
183a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
184a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    @Override
185a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
186a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            IntentFilter filter, String broadcastPermission, Handler scheduler) {
187a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        if (receiver == null) {
188a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            // Allow retrieving current sticky broadcast; this is safe since we
189a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            // aren't actually registering a receiver.
190a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler);
191a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        } else {
192a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            throw new ReceiverCallNotAllowedException(
193a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                    "BroadcastReceiver components are not allowed to register to receive intents");
194a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        }
195a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    }
196a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
197a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    @Override
198a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        throw new ReceiverCallNotAllowedException(
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                "BroadcastReceiver components are not allowed to bind to services");
20191037db265ecdd914a26e056cf69207b4f50924ehkuang    }
202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/**
205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Common implementation of Context API, which provides the base
206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * context object for Activity and other application components.
207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
208b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianclass ContextImpl extends Context {
20991037db265ecdd914a26e056cf69207b4f50924ehkuang    private final static String TAG = "ContextImpl";
210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final static boolean DEBUG = false;
211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21291037db265ecdd914a26e056cf69207b4f50924ehkuang    /**
213b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian     * Map from package name, to preference name, to cached preferences.
214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     */
215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs;
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    final ActivityThread mMainThread;
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    final LoadedApk mPackageInfo;
219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final IBinder mActivityToken;
221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final UserHandle mUser;
223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    private final ApplicationContentResolver mContentResolver;
225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final String mBasePackageName;
227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final String mOpPackageName;
228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
22991037db265ecdd914a26e056cf69207b4f50924ehkuang    private final ResourcesManager mResourcesManager;
230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final Resources mResources;
231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final Display mDisplay; // may be null if default display
23291037db265ecdd914a26e056cf69207b4f50924ehkuang    private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments();
233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final Configuration mOverrideConfiguration;
234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private final boolean mRestricted;
236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23791037db265ecdd914a26e056cf69207b4f50924ehkuang    private Context mOuterContext;
23891037db265ecdd914a26e056cf69207b4f50924ehkuang    private int mThemeResource = 0;
239f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    private Resources.Theme mTheme = null;
2406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    private PackageManager mPackageManager;
2416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    private Context mReceiverRestrictedContext = null;
242f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
24391037db265ecdd914a26e056cf69207b4f50924ehkuang    private final Object mSync = new Object();
24491037db265ecdd914a26e056cf69207b4f50924ehkuang
2456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    @GuardedBy("mSync")
246f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    private File mDatabasesDir;
24791037db265ecdd914a26e056cf69207b4f50924ehkuang    @GuardedBy("mSync")
2486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    private File mPreferencesDir;
249f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    @GuardedBy("mSync")
25091037db265ecdd914a26e056cf69207b4f50924ehkuang    private File mFilesDir;
25191037db265ecdd914a26e056cf69207b4f50924ehkuang    @GuardedBy("mSync")
25291037db265ecdd914a26e056cf69207b4f50924ehkuang    private File mNoBackupFilesDir;
25391037db265ecdd914a26e056cf69207b4f50924ehkuang    @GuardedBy("mSync")
25491037db265ecdd914a26e056cf69207b4f50924ehkuang    private File mCacheDir;
25591037db265ecdd914a26e056cf69207b4f50924ehkuang    @GuardedBy("mSync")
25691037db265ecdd914a26e056cf69207b4f50924ehkuang    private File mCodeCacheDir;
257b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
258b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    @GuardedBy("mSync")
259b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    private File[] mExternalObbDirs;
260b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    @GuardedBy("mSync")
261b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    private File[] mExternalFilesDirs;
262a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    @GuardedBy("mSync")
263a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    private File[] mExternalCacheDirs;
264b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    @GuardedBy("mSync")
265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    private File[] mExternalMediaDirs;
266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
267b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    private static final String[] EMPTY_FILE_LIST = {};
268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
269b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    /**
2709b35249446b07f40ac5fcc3205f2c048616efacchkuang     * Override this class when the system service constructor needs a
2719b35249446b07f40ac5fcc3205f2c048616efacchkuang     * ContextImpl.  Else, use StaticServiceFetcher below.
272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     */
2735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    /*package*/ static class ServiceFetcher {
2745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        int mContextCacheIndex = -1;
275f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
27691037db265ecdd914a26e056cf69207b4f50924ehkuang        /**
27791037db265ecdd914a26e056cf69207b4f50924ehkuang         * Main entrypoint; only override if you don't need caching.
278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         */
2791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        public Object getService(ContextImpl ctx) {
2806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang            ArrayList<Object> cache = ctx.mServiceCache;
2816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang            Object service;
28291037db265ecdd914a26e056cf69207b4f50924ehkuang            synchronized (cache) {
28391037db265ecdd914a26e056cf69207b4f50924ehkuang                if (cache.size() == 0) {
284b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    // Initialize the cache vector on first access.
285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    // At this point sNextPerContextServiceCacheIndex
286b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    // is the number of potential services that are
2879b35249446b07f40ac5fcc3205f2c048616efacchkuang                    // cached per-Context.
2889b35249446b07f40ac5fcc3205f2c048616efacchkuang                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
2899b35249446b07f40ac5fcc3205f2c048616efacchkuang                        cache.add(null);
2905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    }
2919b35249446b07f40ac5fcc3205f2c048616efacchkuang                } else {
2929b35249446b07f40ac5fcc3205f2c048616efacchkuang                    service = cache.get(mContextCacheIndex);
2939b35249446b07f40ac5fcc3205f2c048616efacchkuang                    if (service != null) {
294b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        return service;
295f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    }
296f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                }
2975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                service = createService(ctx);
2985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                cache.set(mContextCacheIndex, service);
299f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                return service;
300f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang            }
301f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        }
3025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        /**
3049b35249446b07f40ac5fcc3205f2c048616efacchkuang         * Override this to create a new per-Context instance of the
305ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         * service.  getService() will handle locking and caching.
306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         */
307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        public Object createService(ContextImpl ctx) {
308f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang            throw new RuntimeException("Not implemented");
309f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        }
3109b35249446b07f40ac5fcc3205f2c048616efacchkuang    }
311b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /**
313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * Override this class for services to be cached process-wide.
314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     */
315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    abstract static class StaticServiceFetcher extends ServiceFetcher {
316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        private Object mCachedInstance;
317b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        @Override
31991037db265ecdd914a26e056cf69207b4f50924ehkuang        public final Object getService(ContextImpl unused) {
320a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            synchronized (StaticServiceFetcher.this) {
321a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                Object service = mCachedInstance;
322a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                if (service != null) {
3235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return service;
3245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }
3251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                return mCachedInstance = createStaticService();
32691037db265ecdd914a26e056cf69207b4f50924ehkuang            }
327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        }
3285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        public abstract Object createStaticService();
33091037db265ecdd914a26e056cf69207b4f50924ehkuang    }
3311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
332a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
333f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang            new HashMap<String, ServiceFetcher>();
334f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
335f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    private static int sNextPerContextServiceCacheIndex = 0;
336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    private static void registerService(String serviceName, ServiceFetcher fetcher) {
337a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        if (!(fetcher instanceof StaticServiceFetcher)) {
338a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
339a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        }
340a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
341a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    }
342a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
343a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    // This one's defined separately and given a variable name so it
344a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    // can be re-used by getWallpaperManager(), avoiding a HashMap
345a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    // lookup.
346a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
347a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            public Object createService(ContextImpl ctx) {
348a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                return new WallpaperManager(ctx.getOuterContext(),
349a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                        ctx.mMainThread.getHandler());
350a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian            }};
351a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
352a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    static {
353a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
354a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                public Object getService(ContextImpl ctx) {
35591037db265ecdd914a26e056cf69207b4f50924ehkuang                    return AccessibilityManager.getInstance(ctx);
356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                }});
3575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        registerService(CAPTIONING_SERVICE, new ServiceFetcher() {
359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                public Object getService(ContextImpl ctx) {
360b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return new CaptioningManager(ctx);
361b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                }});
362b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
364b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                public Object createService(ContextImpl ctx) {
3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
366b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    IAccountManager service = IAccountManager.Stub.asInterface(b);
367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return new AccountManager(ctx, service);
368b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                }});
3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
3715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
3725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
3735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
3745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(ALARM_SERVICE, new ServiceFetcher() {
3765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
377b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
378b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return new AlarmManager(service, ctx);
3805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
3815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(AUDIO_SERVICE, new ServiceFetcher() {
3835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
3845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new AudioManager(ctx);
385b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                }});
386b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() {
3885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
3895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new MediaRouter(ctx);
3905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
391b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
392b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(BLUETOOTH_SERVICE, new ServiceFetcher() {
3935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
3945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new BluetoothManager(ctx);
3955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
3965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
397b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(HDMI_CONTROL_SERVICE, new StaticServiceFetcher() {
398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                public Object createStaticService() {
3995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    IBinder b = ServiceManager.getService(HDMI_CONTROL_SERVICE);
4005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new HdmiControlManager(IHdmiControlService.Stub.asInterface(b));
4015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
4025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
4045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
4055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new ClipboardManager(ctx.getOuterContext(),
4065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            ctx.mMainThread.getHandler());
40791037db265ecdd914a26e056cf69207b4f50924ehkuang                }});
4085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(CONNECTIVITY_SERVICE, new ServiceFetcher() {
4101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                public Object createService(ContextImpl ctx) {
4111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
412f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
41391037db265ecdd914a26e056cf69207b4f50924ehkuang                }});
414b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
415b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
4165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createStaticService() {
4175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
418f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
41991037db265ecdd914a26e056cf69207b4f50924ehkuang                }});
420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
4225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
4235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
4245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
4255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
426f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
42791037db265ecdd914a26e056cf69207b4f50924ehkuang                public Object createService(ContextImpl ctx) {
4281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
4295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
431b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(BATTERY_SERVICE, new ServiceFetcher() {
432b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                public Object createService(ContextImpl ctx) {
433ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    return new BatteryManager();
4345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
4351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        registerService(NFC_SERVICE, new ServiceFetcher() {
437b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                public Object createService(ContextImpl ctx) {
438b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return new NfcManager(ctx);
439a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                }});
440b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
441b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                public Object createStaticService() {
443b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return createDropBoxManager();
444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                }});
4451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
446f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        registerService(INPUT_SERVICE, new StaticServiceFetcher() {
4475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createStaticService() {
4485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return InputManager.getInstance();
4495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
4505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(DISPLAY_SERVICE, new ServiceFetcher() {
4521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                @Override
4531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                public Object createService(ContextImpl ctx) {
4541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                    return new DisplayManager(ctx.getOuterContext());
4551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                }});
456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() {
458b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                public Object createStaticService() {
459b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return InputMethodManager.getInstance();
460b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                }});
461ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
462f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
463ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                public Object createService(ContextImpl ctx) {
464b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return TextServicesManager.getInstance();
465b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                }});
466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
4671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
4681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                public Object getService(ContextImpl ctx) {
469f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    // TODO: why isn't this caching it?  It wasn't
470f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    // before, so I'm preserving the old behavior and
471f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    // using getService(), instead of createService()
472a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                    // which would do the caching.
473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return new KeyguardManager();
474f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                }});
475f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
4765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
477f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                public Object createService(ContextImpl ctx) {
4785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
47991037db265ecdd914a26e056cf69207b4f50924ehkuang                }});
480b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(LOCATION_SERVICE, new ServiceFetcher() {
482b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                public Object createService(ContextImpl ctx) {
483b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
484b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                }});
486b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
487b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
4885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            @Override
4895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            public Object createService(ContextImpl ctx) {
4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
4915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        ServiceManager.getService(NETWORK_POLICY_SERVICE)));
4925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            }
4935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        });
4941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
4955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
496f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                public Object createService(ContextImpl ctx) {
497f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    final Context outerContext = ctx.getOuterContext();
498f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    return new NotificationManager(
499f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                        new ContextThemeWrapper(outerContext,
500f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                Resources.selectSystemTheme(0,
501ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                        outerContext.getApplicationInfo().targetSdkVersion,
502ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                        com.android.internal.R.style.Theme_Dialog,
503f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                        com.android.internal.R.style.Theme_Holo_Dialog,
5045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog,
505f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                        com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)),
5065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        ctx.mMainThread.getHandler());
5075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
5085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
509b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        registerService(NSD_SERVICE, new ServiceFetcher() {
510b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                @Override
51191037db265ecdd914a26e056cf69207b4f50924ehkuang                public Object createService(ContextImpl ctx) {
51291037db265ecdd914a26e056cf69207b4f50924ehkuang                    IBinder b = ServiceManager.getService(NSD_SERVICE);
51391037db265ecdd914a26e056cf69207b4f50924ehkuang                    INsdManager service = INsdManager.Stub.asInterface(b);
5145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new NsdManager(ctx.getOuterContext(), service);
5155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                }});
5165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
517f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        // Note: this was previously cached in a static variable, but
5186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        // constructed using mMainThread.getHandler(), so converting
519f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        // it to be a regular Context-cached service...
520f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        registerService(POWER_SERVICE, new ServiceFetcher() {
521f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                public Object createService(ContextImpl ctx) {
522f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    IBinder b = ServiceManager.getService(POWER_SERVICE);
523f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                    IPowerManager service = IPowerManager.Stub.asInterface(b);
5245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    if (service == null) {
525b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        Log.wtf(TAG, "Failed to get power manager service.");
5265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    }
5275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new PowerManager(ctx.getOuterContext(),
528b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                            service, ctx.mMainThread.getHandler());
529f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                }});
530f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
5315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(SEARCH_SERVICE, new ServiceFetcher() {
532f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                public Object createService(ContextImpl ctx) {
5335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new SearchManager(ctx.getOuterContext(),
534f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                            ctx.mMainThread.getHandler());
535f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                }});
5365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        registerService(SENSOR_SERVICE, new ServiceFetcher() {
5385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                public Object createService(ContextImpl ctx) {
5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    return new SystemSensorManager(ctx.getOuterContext(),
540b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      ctx.mMainThread.getHandler().getLooper());
54191037db265ecdd914a26e056cf69207b4f50924ehkuang                }});
542b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
544                public Object createService(ContextImpl ctx) {
545                    return new StatusBarManager(ctx.getOuterContext());
546                }});
547
548        registerService(STORAGE_SERVICE, new ServiceFetcher() {
549                public Object createService(ContextImpl ctx) {
550                    try {
551                        return new StorageManager(
552                                ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper());
553                    } catch (RemoteException rex) {
554                        Log.e(TAG, "Failed to create StorageManager", rex);
555                        return null;
556                    }
557                }});
558
559        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
560                public Object createService(ContextImpl ctx) {
561                    return new TelephonyManager(ctx.getOuterContext());
562                }});
563
564        registerService(TELECOM_SERVICE, new ServiceFetcher() {
565                public Object createService(ContextImpl ctx) {
566                    return new TelecomManager(ctx.getOuterContext());
567                }});
568
569        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
570                public Object createService(ContextImpl ctx) {
571                    return new UiModeManager();
572                }});
573
574        registerService(USB_SERVICE, new ServiceFetcher() {
575                public Object createService(ContextImpl ctx) {
576                    IBinder b = ServiceManager.getService(USB_SERVICE);
577                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
578                }});
579
580        registerService(SERIAL_SERVICE, new ServiceFetcher() {
581                public Object createService(ContextImpl ctx) {
582                    IBinder b = ServiceManager.getService(SERIAL_SERVICE);
583                    return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
584                }});
585
586        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
587                public Object createService(ContextImpl ctx) {
588                    return new SystemVibrator(ctx);
589                }});
590
591        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
592
593        registerService(WIFI_SERVICE, new ServiceFetcher() {
594                public Object createService(ContextImpl ctx) {
595                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
596                    IWifiManager service = IWifiManager.Stub.asInterface(b);
597                    return new WifiManager(ctx.getOuterContext(), service);
598                }});
599
600        registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
601                public Object createService(ContextImpl ctx) {
602                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
603                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
604                    return new WifiP2pManager(service);
605                }});
606
607        registerService(WIFI_SCANNING_SERVICE, new ServiceFetcher() {
608            public Object createService(ContextImpl ctx) {
609                IBinder b = ServiceManager.getService(WIFI_SCANNING_SERVICE);
610                IWifiScanner service = IWifiScanner.Stub.asInterface(b);
611                return new WifiScanner(ctx.getOuterContext(), service);
612            }});
613
614        registerService(WIFI_RTT_SERVICE, new ServiceFetcher() {
615            public Object createService(ContextImpl ctx) {
616                IBinder b = ServiceManager.getService(WIFI_RTT_SERVICE);
617                IRttManager service = IRttManager.Stub.asInterface(b);
618                return new RttManager(ctx.getOuterContext(), service);
619            }});
620
621        registerService(ETHERNET_SERVICE, new ServiceFetcher() {
622                public Object createService(ContextImpl ctx) {
623                    IBinder b = ServiceManager.getService(ETHERNET_SERVICE);
624                    IEthernetManager service = IEthernetManager.Stub.asInterface(b);
625                    return new EthernetManager(ctx.getOuterContext(), service);
626                }});
627
628        registerService(WINDOW_SERVICE, new ServiceFetcher() {
629                Display mDefaultDisplay;
630                public Object getService(ContextImpl ctx) {
631                    Display display = ctx.mDisplay;
632                    if (display == null) {
633                        if (mDefaultDisplay == null) {
634                            DisplayManager dm = (DisplayManager)ctx.getOuterContext().
635                                    getSystemService(Context.DISPLAY_SERVICE);
636                            mDefaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY);
637                        }
638                        display = mDefaultDisplay;
639                    }
640                    return new WindowManagerImpl(display);
641                }});
642
643        registerService(USER_SERVICE, new ServiceFetcher() {
644            public Object createService(ContextImpl ctx) {
645                IBinder b = ServiceManager.getService(USER_SERVICE);
646                IUserManager service = IUserManager.Stub.asInterface(b);
647                return new UserManager(ctx, service);
648            }});
649
650        registerService(APP_OPS_SERVICE, new ServiceFetcher() {
651            public Object createService(ContextImpl ctx) {
652                IBinder b = ServiceManager.getService(APP_OPS_SERVICE);
653                IAppOpsService service = IAppOpsService.Stub.asInterface(b);
654                return new AppOpsManager(ctx, service);
655            }});
656
657        registerService(CAMERA_SERVICE, new ServiceFetcher() {
658            public Object createService(ContextImpl ctx) {
659                return new CameraManager(ctx);
660            }
661        });
662
663        registerService(LAUNCHER_APPS_SERVICE, new ServiceFetcher() {
664            public Object createService(ContextImpl ctx) {
665                IBinder b = ServiceManager.getService(LAUNCHER_APPS_SERVICE);
666                ILauncherApps service = ILauncherApps.Stub.asInterface(b);
667                return new LauncherApps(ctx, service);
668            }
669        });
670
671        registerService(RESTRICTIONS_SERVICE, new ServiceFetcher() {
672            public Object createService(ContextImpl ctx) {
673                IBinder b = ServiceManager.getService(RESTRICTIONS_SERVICE);
674                IRestrictionsManager service = IRestrictionsManager.Stub.asInterface(b);
675                return new RestrictionsManager(ctx, service);
676            }
677        });
678        registerService(PRINT_SERVICE, new ServiceFetcher() {
679            public Object createService(ContextImpl ctx) {
680                IBinder iBinder = ServiceManager.getService(Context.PRINT_SERVICE);
681                IPrintManager service = IPrintManager.Stub.asInterface(iBinder);
682                return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(),
683                        UserHandle.getAppId(Process.myUid()));
684            }});
685
686        registerService(CONSUMER_IR_SERVICE, new ServiceFetcher() {
687            public Object createService(ContextImpl ctx) {
688                return new ConsumerIrManager(ctx);
689            }});
690
691        registerService(MEDIA_SESSION_SERVICE, new ServiceFetcher() {
692            public Object createService(ContextImpl ctx) {
693                return new MediaSessionManager(ctx);
694            }
695        });
696
697        registerService(TRUST_SERVICE, new ServiceFetcher() {
698            public Object createService(ContextImpl ctx) {
699                IBinder b = ServiceManager.getService(TRUST_SERVICE);
700                return new TrustManager(b);
701            }
702        });
703
704        registerService(FINGERPRINT_SERVICE, new ServiceFetcher() {
705            public Object createService(ContextImpl ctx) {
706                IBinder binder = ServiceManager.getService(FINGERPRINT_SERVICE);
707                IFingerprintService service = IFingerprintService.Stub.asInterface(binder);
708                return new FingerprintManager(ctx.getOuterContext(), service);
709            }
710        });
711
712        registerService(TV_INPUT_SERVICE, new ServiceFetcher() {
713            public Object createService(ContextImpl ctx) {
714                IBinder iBinder = ServiceManager.getService(TV_INPUT_SERVICE);
715                ITvInputManager service = ITvInputManager.Stub.asInterface(iBinder);
716                return new TvInputManager(service, UserHandle.myUserId());
717            }
718        });
719
720        registerService(NETWORK_SCORE_SERVICE, new ServiceFetcher() {
721            public Object createService(ContextImpl ctx) {
722                return new NetworkScoreManager(ctx);
723            }
724        });
725
726        registerService(USAGE_STATS_SERVICE, new ServiceFetcher() {
727            public Object createService(ContextImpl ctx) {
728                IBinder iBinder = ServiceManager.getService(USAGE_STATS_SERVICE);
729                IUsageStatsManager service = IUsageStatsManager.Stub.asInterface(iBinder);
730                return new UsageStatsManager(ctx.getOuterContext(), service);
731            }
732        });
733
734        registerService(JOB_SCHEDULER_SERVICE, new ServiceFetcher() {
735            public Object createService(ContextImpl ctx) {
736                IBinder b = ServiceManager.getService(JOB_SCHEDULER_SERVICE);
737                return new JobSchedulerImpl(IJobScheduler.Stub.asInterface(b));
738        }});
739
740        registerService(PERSISTENT_DATA_BLOCK_SERVICE, new ServiceFetcher() {
741            public Object createService(ContextImpl ctx) {
742                IBinder b = ServiceManager.getService(PERSISTENT_DATA_BLOCK_SERVICE);
743                IPersistentDataBlockService persistentDataBlockService =
744                        IPersistentDataBlockService.Stub.asInterface(b);
745                if (persistentDataBlockService != null) {
746                    return new PersistentDataBlockManager(persistentDataBlockService);
747                } else {
748                    // not supported
749                    return null;
750                }
751            }
752        });
753
754        registerService(MEDIA_PROJECTION_SERVICE, new ServiceFetcher() {
755                public Object createService(ContextImpl ctx) {
756                    return new MediaProjectionManager(ctx);
757                }
758        });
759
760        registerService(APPWIDGET_SERVICE, new ServiceFetcher() {
761            public Object createService(ContextImpl ctx) {
762                IBinder b = ServiceManager.getService(APPWIDGET_SERVICE);
763                return new AppWidgetManager(ctx, IAppWidgetService.Stub.asInterface(b));
764            }});
765    }
766
767    static ContextImpl getImpl(Context context) {
768        Context nextContext;
769        while ((context instanceof ContextWrapper) &&
770                (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
771            context = nextContext;
772        }
773        return (ContextImpl)context;
774    }
775
776    // The system service cache for the system services that are
777    // cached per-ContextImpl.  Package-scoped to avoid accessor
778    // methods.
779    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
780
781    @Override
782    public AssetManager getAssets() {
783        return getResources().getAssets();
784    }
785
786    @Override
787    public Resources getResources() {
788        return mResources;
789    }
790
791    @Override
792    public PackageManager getPackageManager() {
793        if (mPackageManager != null) {
794            return mPackageManager;
795        }
796
797        IPackageManager pm = ActivityThread.getPackageManager();
798        if (pm != null) {
799            // Doesn't matter if we make more than one instance.
800            return (mPackageManager = new ApplicationPackageManager(this, pm));
801        }
802
803        return null;
804    }
805
806    @Override
807    public ContentResolver getContentResolver() {
808        return mContentResolver;
809    }
810
811    @Override
812    public Looper getMainLooper() {
813        return mMainThread.getLooper();
814    }
815
816    @Override
817    public Context getApplicationContext() {
818        return (mPackageInfo != null) ?
819                mPackageInfo.getApplication() : mMainThread.getApplication();
820    }
821
822    @Override
823    public void setTheme(int resid) {
824        mThemeResource = resid;
825    }
826
827    @Override
828    public int getThemeResId() {
829        return mThemeResource;
830    }
831
832    @Override
833    public Resources.Theme getTheme() {
834        if (mTheme == null) {
835            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
836                    getOuterContext().getApplicationInfo().targetSdkVersion);
837            mTheme = mResources.newTheme();
838            mTheme.applyStyle(mThemeResource, true);
839        }
840        return mTheme;
841    }
842
843    @Override
844    public ClassLoader getClassLoader() {
845        return mPackageInfo != null ?
846                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
847    }
848
849    @Override
850    public String getPackageName() {
851        if (mPackageInfo != null) {
852            return mPackageInfo.getPackageName();
853        }
854        // No mPackageInfo means this is a Context for the system itself,
855        // and this here is its name.
856        return "android";
857    }
858
859    /** @hide */
860    @Override
861    public String getBasePackageName() {
862        return mBasePackageName != null ? mBasePackageName : getPackageName();
863    }
864
865    /** @hide */
866    @Override
867    public String getOpPackageName() {
868        return mOpPackageName != null ? mOpPackageName : getBasePackageName();
869    }
870
871    @Override
872    public ApplicationInfo getApplicationInfo() {
873        if (mPackageInfo != null) {
874            return mPackageInfo.getApplicationInfo();
875        }
876        throw new RuntimeException("Not supported in system context");
877    }
878
879    @Override
880    public String getPackageResourcePath() {
881        if (mPackageInfo != null) {
882            return mPackageInfo.getResDir();
883        }
884        throw new RuntimeException("Not supported in system context");
885    }
886
887    @Override
888    public String getPackageCodePath() {
889        if (mPackageInfo != null) {
890            return mPackageInfo.getAppDir();
891        }
892        throw new RuntimeException("Not supported in system context");
893    }
894
895    public File getSharedPrefsFile(String name) {
896        return makeFilename(getPreferencesDir(), name + ".xml");
897    }
898
899    @Override
900    public SharedPreferences getSharedPreferences(String name, int mode) {
901        SharedPreferencesImpl sp;
902        synchronized (ContextImpl.class) {
903            if (sSharedPrefs == null) {
904                sSharedPrefs = new ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>();
905            }
906
907            final String packageName = getPackageName();
908            ArrayMap<String, SharedPreferencesImpl> packagePrefs = sSharedPrefs.get(packageName);
909            if (packagePrefs == null) {
910                packagePrefs = new ArrayMap<String, SharedPreferencesImpl>();
911                sSharedPrefs.put(packageName, packagePrefs);
912            }
913
914            // At least one application in the world actually passes in a null
915            // name.  This happened to work because when we generated the file name
916            // we would stringify it to "null.xml".  Nice.
917            if (mPackageInfo.getApplicationInfo().targetSdkVersion <
918                    Build.VERSION_CODES.KITKAT) {
919                if (name == null) {
920                    name = "null";
921                }
922            }
923
924            sp = packagePrefs.get(name);
925            if (sp == null) {
926                File prefsFile = getSharedPrefsFile(name);
927                sp = new SharedPreferencesImpl(prefsFile, mode);
928                packagePrefs.put(name, sp);
929                return sp;
930            }
931        }
932        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
933            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
934            // If somebody else (some other process) changed the prefs
935            // file behind our back, we reload it.  This has been the
936            // historical (if undocumented) behavior.
937            sp.startReloadIfChangedUnexpectedly();
938        }
939        return sp;
940    }
941
942    private File getPreferencesDir() {
943        synchronized (mSync) {
944            if (mPreferencesDir == null) {
945                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
946            }
947            return mPreferencesDir;
948        }
949    }
950
951    @Override
952    public FileInputStream openFileInput(String name)
953        throws FileNotFoundException {
954        File f = makeFilename(getFilesDir(), name);
955        return new FileInputStream(f);
956    }
957
958    @Override
959    public FileOutputStream openFileOutput(String name, int mode)
960        throws FileNotFoundException {
961        final boolean append = (mode&MODE_APPEND) != 0;
962        File f = makeFilename(getFilesDir(), name);
963        try {
964            FileOutputStream fos = new FileOutputStream(f, append);
965            setFilePermissionsFromMode(f.getPath(), mode, 0);
966            return fos;
967        } catch (FileNotFoundException e) {
968        }
969
970        File parent = f.getParentFile();
971        parent.mkdir();
972        FileUtils.setPermissions(
973            parent.getPath(),
974            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
975            -1, -1);
976        FileOutputStream fos = new FileOutputStream(f, append);
977        setFilePermissionsFromMode(f.getPath(), mode, 0);
978        return fos;
979    }
980
981    @Override
982    public boolean deleteFile(String name) {
983        File f = makeFilename(getFilesDir(), name);
984        return f.delete();
985    }
986
987    // Common-path handling of app data dir creation
988    private static File createFilesDirLocked(File file) {
989        if (!file.exists()) {
990            if (!file.mkdirs()) {
991                if (file.exists()) {
992                    // spurious failure; probably racing with another process for this app
993                    return file;
994                }
995                Log.w(TAG, "Unable to create files subdir " + file.getPath());
996                return null;
997            }
998            FileUtils.setPermissions(
999                    file.getPath(),
1000                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1001                    -1, -1);
1002        }
1003        return file;
1004    }
1005
1006    @Override
1007    public File getFilesDir() {
1008        synchronized (mSync) {
1009            if (mFilesDir == null) {
1010                mFilesDir = new File(getDataDirFile(), "files");
1011            }
1012            return createFilesDirLocked(mFilesDir);
1013        }
1014    }
1015
1016    @Override
1017    public File getNoBackupFilesDir() {
1018        synchronized (mSync) {
1019            if (mNoBackupFilesDir == null) {
1020                mNoBackupFilesDir = new File(getDataDirFile(), "no_backup");
1021            }
1022            return createFilesDirLocked(mNoBackupFilesDir);
1023        }
1024    }
1025
1026    @Override
1027    public File getExternalFilesDir(String type) {
1028        // Operates on primary external storage
1029        return getExternalFilesDirs(type)[0];
1030    }
1031
1032    @Override
1033    public File[] getExternalFilesDirs(String type) {
1034        synchronized (mSync) {
1035            if (mExternalFilesDirs == null) {
1036                mExternalFilesDirs = Environment.buildExternalStorageAppFilesDirs(getPackageName());
1037            }
1038
1039            // Splice in requested type, if any
1040            File[] dirs = mExternalFilesDirs;
1041            if (type != null) {
1042                dirs = Environment.buildPaths(dirs, type);
1043            }
1044
1045            // Create dirs if needed
1046            return ensureDirsExistOrFilter(dirs);
1047        }
1048    }
1049
1050    @Override
1051    public File getObbDir() {
1052        // Operates on primary external storage
1053        return getObbDirs()[0];
1054    }
1055
1056    @Override
1057    public File[] getObbDirs() {
1058        synchronized (mSync) {
1059            if (mExternalObbDirs == null) {
1060                mExternalObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName());
1061            }
1062
1063            // Create dirs if needed
1064            return ensureDirsExistOrFilter(mExternalObbDirs);
1065        }
1066    }
1067
1068    @Override
1069    public File getCacheDir() {
1070        synchronized (mSync) {
1071            if (mCacheDir == null) {
1072                mCacheDir = new File(getDataDirFile(), "cache");
1073            }
1074            return createFilesDirLocked(mCacheDir);
1075        }
1076    }
1077
1078    @Override
1079    public File getCodeCacheDir() {
1080        synchronized (mSync) {
1081            if (mCodeCacheDir == null) {
1082                mCodeCacheDir = new File(getDataDirFile(), "code_cache");
1083            }
1084            return createFilesDirLocked(mCodeCacheDir);
1085        }
1086    }
1087
1088    @Override
1089    public File getExternalCacheDir() {
1090        // Operates on primary external storage
1091        return getExternalCacheDirs()[0];
1092    }
1093
1094    @Override
1095    public File[] getExternalCacheDirs() {
1096        synchronized (mSync) {
1097            if (mExternalCacheDirs == null) {
1098                mExternalCacheDirs = Environment.buildExternalStorageAppCacheDirs(getPackageName());
1099            }
1100
1101            // Create dirs if needed
1102            return ensureDirsExistOrFilter(mExternalCacheDirs);
1103        }
1104    }
1105
1106    @Override
1107    public File[] getExternalMediaDirs() {
1108        synchronized (mSync) {
1109            if (mExternalMediaDirs == null) {
1110                mExternalMediaDirs = Environment.buildExternalStorageAppMediaDirs(getPackageName());
1111            }
1112
1113            // Create dirs if needed
1114            return ensureDirsExistOrFilter(mExternalMediaDirs);
1115        }
1116    }
1117
1118    @Override
1119    public File getFileStreamPath(String name) {
1120        return makeFilename(getFilesDir(), name);
1121    }
1122
1123    @Override
1124    public String[] fileList() {
1125        final String[] list = getFilesDir().list();
1126        return (list != null) ? list : EMPTY_FILE_LIST;
1127    }
1128
1129    @Override
1130    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
1131        return openOrCreateDatabase(name, mode, factory, null);
1132    }
1133
1134    @Override
1135    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
1136            DatabaseErrorHandler errorHandler) {
1137        File f = validateFilePath(name, true);
1138        int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
1139        if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
1140            flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
1141        }
1142        SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
1143        setFilePermissionsFromMode(f.getPath(), mode, 0);
1144        return db;
1145    }
1146
1147    @Override
1148    public boolean deleteDatabase(String name) {
1149        try {
1150            File f = validateFilePath(name, false);
1151            return SQLiteDatabase.deleteDatabase(f);
1152        } catch (Exception e) {
1153        }
1154        return false;
1155    }
1156
1157    @Override
1158    public File getDatabasePath(String name) {
1159        return validateFilePath(name, false);
1160    }
1161
1162    @Override
1163    public String[] databaseList() {
1164        final String[] list = getDatabasesDir().list();
1165        return (list != null) ? list : EMPTY_FILE_LIST;
1166    }
1167
1168
1169    private File getDatabasesDir() {
1170        synchronized (mSync) {
1171            if (mDatabasesDir == null) {
1172                mDatabasesDir = new File(getDataDirFile(), "databases");
1173            }
1174            if (mDatabasesDir.getPath().equals("databases")) {
1175                mDatabasesDir = new File("/data/system");
1176            }
1177            return mDatabasesDir;
1178        }
1179    }
1180
1181    @Override
1182    public Drawable getWallpaper() {
1183        return getWallpaperManager().getDrawable();
1184    }
1185
1186    @Override
1187    public Drawable peekWallpaper() {
1188        return getWallpaperManager().peekDrawable();
1189    }
1190
1191    @Override
1192    public int getWallpaperDesiredMinimumWidth() {
1193        return getWallpaperManager().getDesiredMinimumWidth();
1194    }
1195
1196    @Override
1197    public int getWallpaperDesiredMinimumHeight() {
1198        return getWallpaperManager().getDesiredMinimumHeight();
1199    }
1200
1201    @Override
1202    public void setWallpaper(Bitmap bitmap) throws IOException  {
1203        getWallpaperManager().setBitmap(bitmap);
1204    }
1205
1206    @Override
1207    public void setWallpaper(InputStream data) throws IOException {
1208        getWallpaperManager().setStream(data);
1209    }
1210
1211    @Override
1212    public void clearWallpaper() throws IOException {
1213        getWallpaperManager().clear();
1214    }
1215
1216    @Override
1217    public void startActivity(Intent intent) {
1218        warnIfCallingFromSystemProcess();
1219        startActivity(intent, null);
1220    }
1221
1222    /** @hide */
1223    @Override
1224    public void startActivityAsUser(Intent intent, UserHandle user) {
1225        startActivityAsUser(intent, null, user);
1226    }
1227
1228    @Override
1229    public void startActivity(Intent intent, Bundle options) {
1230        warnIfCallingFromSystemProcess();
1231        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1232            throw new AndroidRuntimeException(
1233                    "Calling startActivity() from outside of an Activity "
1234                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
1235                    + " Is this really what you want?");
1236        }
1237        mMainThread.getInstrumentation().execStartActivity(
1238            getOuterContext(), mMainThread.getApplicationThread(), null,
1239            (Activity)null, intent, -1, options);
1240    }
1241
1242    /** @hide */
1243    @Override
1244    public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
1245        try {
1246            ActivityManagerNative.getDefault().startActivityAsUser(
1247                mMainThread.getApplicationThread(), getBasePackageName(), intent,
1248                intent.resolveTypeIfNeeded(getContentResolver()),
1249                null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options,
1250                user.getIdentifier());
1251        } catch (RemoteException re) {
1252        }
1253    }
1254
1255    @Override
1256    public void startActivities(Intent[] intents) {
1257        warnIfCallingFromSystemProcess();
1258        startActivities(intents, null);
1259    }
1260
1261    /** @hide */
1262    @Override
1263    public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
1264        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1265            throw new AndroidRuntimeException(
1266                    "Calling startActivities() from outside of an Activity "
1267                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
1268                    + " Is this really what you want?");
1269        }
1270        mMainThread.getInstrumentation().execStartActivitiesAsUser(
1271            getOuterContext(), mMainThread.getApplicationThread(), null,
1272            (Activity)null, intents, options, userHandle.getIdentifier());
1273    }
1274
1275    @Override
1276    public void startActivities(Intent[] intents, Bundle options) {
1277        warnIfCallingFromSystemProcess();
1278        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1279            throw new AndroidRuntimeException(
1280                    "Calling startActivities() from outside of an Activity "
1281                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
1282                    + " Is this really what you want?");
1283        }
1284        mMainThread.getInstrumentation().execStartActivities(
1285            getOuterContext(), mMainThread.getApplicationThread(), null,
1286            (Activity)null, intents, options);
1287    }
1288
1289    @Override
1290    public void startIntentSender(IntentSender intent,
1291            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1292            throws IntentSender.SendIntentException {
1293        startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
1294    }
1295
1296    @Override
1297    public void startIntentSender(IntentSender intent, Intent fillInIntent,
1298            int flagsMask, int flagsValues, int extraFlags, Bundle options)
1299            throws IntentSender.SendIntentException {
1300        try {
1301            String resolvedType = null;
1302            if (fillInIntent != null) {
1303                fillInIntent.migrateExtraStreamToClipData();
1304                fillInIntent.prepareToLeaveProcess();
1305                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
1306            }
1307            int result = ActivityManagerNative.getDefault()
1308                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
1309                        fillInIntent, resolvedType, null, null,
1310                        0, flagsMask, flagsValues, options);
1311            if (result == ActivityManager.START_CANCELED) {
1312                throw new IntentSender.SendIntentException();
1313            }
1314            Instrumentation.checkStartActivityResult(result, null);
1315        } catch (RemoteException e) {
1316        }
1317    }
1318
1319    @Override
1320    public void sendBroadcast(Intent intent) {
1321        warnIfCallingFromSystemProcess();
1322        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1323        try {
1324            intent.prepareToLeaveProcess();
1325            ActivityManagerNative.getDefault().broadcastIntent(
1326                mMainThread.getApplicationThread(), intent, resolvedType, null,
1327                Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false,
1328                getUserId());
1329        } catch (RemoteException e) {
1330        }
1331    }
1332
1333    @Override
1334    public void sendBroadcast(Intent intent, String receiverPermission) {
1335        warnIfCallingFromSystemProcess();
1336        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1337        try {
1338            intent.prepareToLeaveProcess();
1339            ActivityManagerNative.getDefault().broadcastIntent(
1340                mMainThread.getApplicationThread(), intent, resolvedType, null,
1341                Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE,
1342                false, false, getUserId());
1343        } catch (RemoteException e) {
1344        }
1345    }
1346
1347    @Override
1348    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1349        warnIfCallingFromSystemProcess();
1350        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1351        try {
1352            intent.prepareToLeaveProcess();
1353            ActivityManagerNative.getDefault().broadcastIntent(
1354                mMainThread.getApplicationThread(), intent, resolvedType, null,
1355                Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
1356                getUserId());
1357        } catch (RemoteException e) {
1358        }
1359    }
1360
1361    @Override
1362    public void sendOrderedBroadcast(Intent intent,
1363            String receiverPermission) {
1364        warnIfCallingFromSystemProcess();
1365        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1366        try {
1367            intent.prepareToLeaveProcess();
1368            ActivityManagerNative.getDefault().broadcastIntent(
1369                mMainThread.getApplicationThread(), intent, resolvedType, null,
1370                Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false,
1371                getUserId());
1372        } catch (RemoteException e) {
1373        }
1374    }
1375
1376    @Override
1377    public void sendOrderedBroadcast(Intent intent,
1378            String receiverPermission, BroadcastReceiver resultReceiver,
1379            Handler scheduler, int initialCode, String initialData,
1380            Bundle initialExtras) {
1381        sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE,
1382                resultReceiver, scheduler, initialCode, initialData, initialExtras);
1383    }
1384
1385    @Override
1386    public void sendOrderedBroadcast(Intent intent,
1387            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1388            Handler scheduler, int initialCode, String initialData,
1389            Bundle initialExtras) {
1390        warnIfCallingFromSystemProcess();
1391        IIntentReceiver rd = null;
1392        if (resultReceiver != null) {
1393            if (mPackageInfo != null) {
1394                if (scheduler == null) {
1395                    scheduler = mMainThread.getHandler();
1396                }
1397                rd = mPackageInfo.getReceiverDispatcher(
1398                    resultReceiver, getOuterContext(), scheduler,
1399                    mMainThread.getInstrumentation(), false);
1400            } else {
1401                if (scheduler == null) {
1402                    scheduler = mMainThread.getHandler();
1403                }
1404                rd = new LoadedApk.ReceiverDispatcher(
1405                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1406            }
1407        }
1408        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1409        try {
1410            intent.prepareToLeaveProcess();
1411            ActivityManagerNative.getDefault().broadcastIntent(
1412                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1413                initialCode, initialData, initialExtras, receiverPermission, appOp,
1414                    true, false, getUserId());
1415        } catch (RemoteException e) {
1416        }
1417    }
1418
1419    @Override
1420    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
1421        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1422        try {
1423            intent.prepareToLeaveProcess();
1424            ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
1425                    intent, resolvedType, null, Activity.RESULT_OK, null, null, null,
1426                    AppOpsManager.OP_NONE, false, false, user.getIdentifier());
1427        } catch (RemoteException e) {
1428        }
1429    }
1430
1431    @Override
1432    public void sendBroadcastAsUser(Intent intent, UserHandle user,
1433            String receiverPermission) {
1434        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1435        try {
1436            intent.prepareToLeaveProcess();
1437            ActivityManagerNative.getDefault().broadcastIntent(
1438                mMainThread.getApplicationThread(), intent, resolvedType, null,
1439                Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false,
1440                user.getIdentifier());
1441        } catch (RemoteException e) {
1442        }
1443    }
1444
1445    @Override
1446    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1447            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
1448            int initialCode, String initialData, Bundle initialExtras) {
1449        sendOrderedBroadcastAsUser(intent, user, receiverPermission, AppOpsManager.OP_NONE,
1450                resultReceiver, scheduler, initialCode, initialData, initialExtras);
1451    }
1452
1453    @Override
1454    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1455            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1456            Handler scheduler,
1457            int initialCode, String initialData, Bundle initialExtras) {
1458        IIntentReceiver rd = null;
1459        if (resultReceiver != null) {
1460            if (mPackageInfo != null) {
1461                if (scheduler == null) {
1462                    scheduler = mMainThread.getHandler();
1463                }
1464                rd = mPackageInfo.getReceiverDispatcher(
1465                    resultReceiver, getOuterContext(), scheduler,
1466                    mMainThread.getInstrumentation(), false);
1467            } else {
1468                if (scheduler == null) {
1469                    scheduler = mMainThread.getHandler();
1470                }
1471                rd = new LoadedApk.ReceiverDispatcher(
1472                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1473            }
1474        }
1475        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1476        try {
1477            intent.prepareToLeaveProcess();
1478            ActivityManagerNative.getDefault().broadcastIntent(
1479                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1480                initialCode, initialData, initialExtras, receiverPermission,
1481                    appOp, true, false, user.getIdentifier());
1482        } catch (RemoteException e) {
1483        }
1484    }
1485
1486    @Override
1487    public void sendStickyBroadcast(Intent intent) {
1488        warnIfCallingFromSystemProcess();
1489        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1490        try {
1491            intent.prepareToLeaveProcess();
1492            ActivityManagerNative.getDefault().broadcastIntent(
1493                mMainThread.getApplicationThread(), intent, resolvedType, null,
1494                Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true,
1495                getUserId());
1496        } catch (RemoteException e) {
1497        }
1498    }
1499
1500    @Override
1501    public void sendStickyOrderedBroadcast(Intent intent,
1502            BroadcastReceiver resultReceiver,
1503            Handler scheduler, int initialCode, String initialData,
1504            Bundle initialExtras) {
1505        warnIfCallingFromSystemProcess();
1506        IIntentReceiver rd = null;
1507        if (resultReceiver != null) {
1508            if (mPackageInfo != null) {
1509                if (scheduler == null) {
1510                    scheduler = mMainThread.getHandler();
1511                }
1512                rd = mPackageInfo.getReceiverDispatcher(
1513                    resultReceiver, getOuterContext(), scheduler,
1514                    mMainThread.getInstrumentation(), false);
1515            } else {
1516                if (scheduler == null) {
1517                    scheduler = mMainThread.getHandler();
1518                }
1519                rd = new LoadedApk.ReceiverDispatcher(
1520                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1521            }
1522        }
1523        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1524        try {
1525            intent.prepareToLeaveProcess();
1526            ActivityManagerNative.getDefault().broadcastIntent(
1527                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1528                initialCode, initialData, initialExtras, null,
1529                    AppOpsManager.OP_NONE, true, true, getUserId());
1530        } catch (RemoteException e) {
1531        }
1532    }
1533
1534    @Override
1535    public void removeStickyBroadcast(Intent intent) {
1536        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1537        if (resolvedType != null) {
1538            intent = new Intent(intent);
1539            intent.setDataAndType(intent.getData(), resolvedType);
1540        }
1541        try {
1542            intent.prepareToLeaveProcess();
1543            ActivityManagerNative.getDefault().unbroadcastIntent(
1544                    mMainThread.getApplicationThread(), intent, getUserId());
1545        } catch (RemoteException e) {
1546        }
1547    }
1548
1549    @Override
1550    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1551        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1552        try {
1553            intent.prepareToLeaveProcess();
1554            ActivityManagerNative.getDefault().broadcastIntent(
1555                mMainThread.getApplicationThread(), intent, resolvedType, null,
1556                Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier());
1557        } catch (RemoteException e) {
1558        }
1559    }
1560
1561    @Override
1562    public void sendStickyOrderedBroadcastAsUser(Intent intent,
1563            UserHandle user, BroadcastReceiver resultReceiver,
1564            Handler scheduler, int initialCode, String initialData,
1565            Bundle initialExtras) {
1566        IIntentReceiver rd = null;
1567        if (resultReceiver != null) {
1568            if (mPackageInfo != null) {
1569                if (scheduler == null) {
1570                    scheduler = mMainThread.getHandler();
1571                }
1572                rd = mPackageInfo.getReceiverDispatcher(
1573                    resultReceiver, getOuterContext(), scheduler,
1574                    mMainThread.getInstrumentation(), false);
1575            } else {
1576                if (scheduler == null) {
1577                    scheduler = mMainThread.getHandler();
1578                }
1579                rd = new LoadedApk.ReceiverDispatcher(
1580                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1581            }
1582        }
1583        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1584        try {
1585            intent.prepareToLeaveProcess();
1586            ActivityManagerNative.getDefault().broadcastIntent(
1587                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1588                initialCode, initialData, initialExtras, null,
1589                    AppOpsManager.OP_NONE, true, true, user.getIdentifier());
1590        } catch (RemoteException e) {
1591        }
1592    }
1593
1594    @Override
1595    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
1596        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1597        if (resolvedType != null) {
1598            intent = new Intent(intent);
1599            intent.setDataAndType(intent.getData(), resolvedType);
1600        }
1601        try {
1602            intent.prepareToLeaveProcess();
1603            ActivityManagerNative.getDefault().unbroadcastIntent(
1604                    mMainThread.getApplicationThread(), intent, user.getIdentifier());
1605        } catch (RemoteException e) {
1606        }
1607    }
1608
1609    @Override
1610    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1611        return registerReceiver(receiver, filter, null, null);
1612    }
1613
1614    @Override
1615    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1616            String broadcastPermission, Handler scheduler) {
1617        return registerReceiverInternal(receiver, getUserId(),
1618                filter, broadcastPermission, scheduler, getOuterContext());
1619    }
1620
1621    @Override
1622    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
1623            IntentFilter filter, String broadcastPermission, Handler scheduler) {
1624        return registerReceiverInternal(receiver, user.getIdentifier(),
1625                filter, broadcastPermission, scheduler, getOuterContext());
1626    }
1627
1628    private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
1629            IntentFilter filter, String broadcastPermission,
1630            Handler scheduler, Context context) {
1631        IIntentReceiver rd = null;
1632        if (receiver != null) {
1633            if (mPackageInfo != null && context != null) {
1634                if (scheduler == null) {
1635                    scheduler = mMainThread.getHandler();
1636                }
1637                rd = mPackageInfo.getReceiverDispatcher(
1638                    receiver, context, scheduler,
1639                    mMainThread.getInstrumentation(), true);
1640            } else {
1641                if (scheduler == null) {
1642                    scheduler = mMainThread.getHandler();
1643                }
1644                rd = new LoadedApk.ReceiverDispatcher(
1645                        receiver, context, scheduler, null, true).getIIntentReceiver();
1646            }
1647        }
1648        try {
1649            return ActivityManagerNative.getDefault().registerReceiver(
1650                    mMainThread.getApplicationThread(), mBasePackageName,
1651                    rd, filter, broadcastPermission, userId);
1652        } catch (RemoteException e) {
1653            return null;
1654        }
1655    }
1656
1657    @Override
1658    public void unregisterReceiver(BroadcastReceiver receiver) {
1659        if (mPackageInfo != null) {
1660            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
1661                    getOuterContext(), receiver);
1662            try {
1663                ActivityManagerNative.getDefault().unregisterReceiver(rd);
1664            } catch (RemoteException e) {
1665            }
1666        } else {
1667            throw new RuntimeException("Not supported in system context");
1668        }
1669    }
1670
1671    private void validateServiceIntent(Intent service) {
1672        if (service.getComponent() == null && service.getPackage() == null) {
1673            if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {
1674                IllegalArgumentException ex = new IllegalArgumentException(
1675                        "Service Intent must be explicit: " + service);
1676                throw ex;
1677            } else {
1678                Log.w(TAG, "Implicit intents with startService are not safe: " + service
1679                        + " " + Debug.getCallers(2, 3));
1680            }
1681        }
1682    }
1683
1684    @Override
1685    public ComponentName startService(Intent service) {
1686        warnIfCallingFromSystemProcess();
1687        return startServiceCommon(service, mUser);
1688    }
1689
1690    @Override
1691    public boolean stopService(Intent service) {
1692        warnIfCallingFromSystemProcess();
1693        return stopServiceCommon(service, mUser);
1694    }
1695
1696    @Override
1697    public ComponentName startServiceAsUser(Intent service, UserHandle user) {
1698        return startServiceCommon(service, user);
1699    }
1700
1701    private ComponentName startServiceCommon(Intent service, UserHandle user) {
1702        try {
1703            validateServiceIntent(service);
1704            service.prepareToLeaveProcess();
1705            ComponentName cn = ActivityManagerNative.getDefault().startService(
1706                mMainThread.getApplicationThread(), service,
1707                service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1708            if (cn != null) {
1709                if (cn.getPackageName().equals("!")) {
1710                    throw new SecurityException(
1711                            "Not allowed to start service " + service
1712                            + " without permission " + cn.getClassName());
1713                } else if (cn.getPackageName().equals("!!")) {
1714                    throw new SecurityException(
1715                            "Unable to start service " + service
1716                            + ": " + cn.getClassName());
1717                }
1718            }
1719            return cn;
1720        } catch (RemoteException e) {
1721            return null;
1722        }
1723    }
1724
1725    @Override
1726    public boolean stopServiceAsUser(Intent service, UserHandle user) {
1727        return stopServiceCommon(service, user);
1728    }
1729
1730    private boolean stopServiceCommon(Intent service, UserHandle user) {
1731        try {
1732            validateServiceIntent(service);
1733            service.prepareToLeaveProcess();
1734            int res = ActivityManagerNative.getDefault().stopService(
1735                mMainThread.getApplicationThread(), service,
1736                service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1737            if (res < 0) {
1738                throw new SecurityException(
1739                        "Not allowed to stop service " + service);
1740            }
1741            return res != 0;
1742        } catch (RemoteException e) {
1743            return false;
1744        }
1745    }
1746
1747    @Override
1748    public boolean bindService(Intent service, ServiceConnection conn,
1749            int flags) {
1750        warnIfCallingFromSystemProcess();
1751        return bindServiceCommon(service, conn, flags, Process.myUserHandle());
1752    }
1753
1754    /** @hide */
1755    @Override
1756    public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
1757            UserHandle user) {
1758        return bindServiceCommon(service, conn, flags, user);
1759    }
1760
1761    private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
1762            UserHandle user) {
1763        IServiceConnection sd;
1764        if (conn == null) {
1765            throw new IllegalArgumentException("connection is null");
1766        }
1767        if (mPackageInfo != null) {
1768            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
1769                    mMainThread.getHandler(), flags);
1770        } else {
1771            throw new RuntimeException("Not supported in system context");
1772        }
1773        validateServiceIntent(service);
1774        try {
1775            IBinder token = getActivityToken();
1776            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1777                    && mPackageInfo.getApplicationInfo().targetSdkVersion
1778                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1779                flags |= BIND_WAIVE_PRIORITY;
1780            }
1781            service.prepareToLeaveProcess();
1782            int res = ActivityManagerNative.getDefault().bindService(
1783                mMainThread.getApplicationThread(), getActivityToken(),
1784                service, service.resolveTypeIfNeeded(getContentResolver()),
1785                sd, flags, user.getIdentifier());
1786            if (res < 0) {
1787                throw new SecurityException(
1788                        "Not allowed to bind to service " + service);
1789            }
1790            return res != 0;
1791        } catch (RemoteException e) {
1792            return false;
1793        }
1794    }
1795
1796    @Override
1797    public void unbindService(ServiceConnection conn) {
1798        if (conn == null) {
1799            throw new IllegalArgumentException("connection is null");
1800        }
1801        if (mPackageInfo != null) {
1802            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
1803                    getOuterContext(), conn);
1804            try {
1805                ActivityManagerNative.getDefault().unbindService(sd);
1806            } catch (RemoteException e) {
1807            }
1808        } else {
1809            throw new RuntimeException("Not supported in system context");
1810        }
1811    }
1812
1813    @Override
1814    public boolean startInstrumentation(ComponentName className,
1815            String profileFile, Bundle arguments) {
1816        try {
1817            if (arguments != null) {
1818                arguments.setAllowFds(false);
1819            }
1820            return ActivityManagerNative.getDefault().startInstrumentation(
1821                    className, profileFile, 0, arguments, null, null, getUserId(),
1822                    null /* ABI override */);
1823        } catch (RemoteException e) {
1824            // System has crashed, nothing we can do.
1825        }
1826        return false;
1827    }
1828
1829    @Override
1830    public Object getSystemService(String name) {
1831        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1832        return fetcher == null ? null : fetcher.getService(this);
1833    }
1834
1835    private WallpaperManager getWallpaperManager() {
1836        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
1837    }
1838
1839    /* package */ static DropBoxManager createDropBoxManager() {
1840        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1841        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1842        if (service == null) {
1843            // Don't return a DropBoxManager that will NPE upon use.
1844            // This also avoids caching a broken DropBoxManager in
1845            // getDropBoxManager during early boot, before the
1846            // DROPBOX_SERVICE is registered.
1847            return null;
1848        }
1849        return new DropBoxManager(service);
1850    }
1851
1852    @Override
1853    public int checkPermission(String permission, int pid, int uid) {
1854        if (permission == null) {
1855            throw new IllegalArgumentException("permission is null");
1856        }
1857
1858        try {
1859            return ActivityManagerNative.getDefault().checkPermission(
1860                    permission, pid, uid);
1861        } catch (RemoteException e) {
1862            return PackageManager.PERMISSION_DENIED;
1863        }
1864    }
1865
1866    @Override
1867    public int checkCallingPermission(String permission) {
1868        if (permission == null) {
1869            throw new IllegalArgumentException("permission is null");
1870        }
1871
1872        int pid = Binder.getCallingPid();
1873        if (pid != Process.myPid()) {
1874            return checkPermission(permission, pid, Binder.getCallingUid());
1875        }
1876        return PackageManager.PERMISSION_DENIED;
1877    }
1878
1879    @Override
1880    public int checkCallingOrSelfPermission(String permission) {
1881        if (permission == null) {
1882            throw new IllegalArgumentException("permission is null");
1883        }
1884
1885        return checkPermission(permission, Binder.getCallingPid(),
1886                Binder.getCallingUid());
1887    }
1888
1889    private void enforce(
1890            String permission, int resultOfCheck,
1891            boolean selfToo, int uid, String message) {
1892        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1893            throw new SecurityException(
1894                    (message != null ? (message + ": ") : "") +
1895                    (selfToo
1896                     ? "Neither user " + uid + " nor current process has "
1897                     : "uid " + uid + " does not have ") +
1898                    permission +
1899                    ".");
1900        }
1901    }
1902
1903    public void enforcePermission(
1904            String permission, int pid, int uid, String message) {
1905        enforce(permission,
1906                checkPermission(permission, pid, uid),
1907                false,
1908                uid,
1909                message);
1910    }
1911
1912    public void enforceCallingPermission(String permission, String message) {
1913        enforce(permission,
1914                checkCallingPermission(permission),
1915                false,
1916                Binder.getCallingUid(),
1917                message);
1918    }
1919
1920    public void enforceCallingOrSelfPermission(
1921            String permission, String message) {
1922        enforce(permission,
1923                checkCallingOrSelfPermission(permission),
1924                true,
1925                Binder.getCallingUid(),
1926                message);
1927    }
1928
1929    @Override
1930    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
1931         try {
1932            ActivityManagerNative.getDefault().grantUriPermission(
1933                    mMainThread.getApplicationThread(), toPackage,
1934                    ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri));
1935        } catch (RemoteException e) {
1936        }
1937    }
1938
1939    @Override
1940    public void revokeUriPermission(Uri uri, int modeFlags) {
1941         try {
1942            ActivityManagerNative.getDefault().revokeUriPermission(
1943                    mMainThread.getApplicationThread(),
1944                    ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri));
1945        } catch (RemoteException e) {
1946        }
1947    }
1948
1949    @Override
1950    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
1951        try {
1952            return ActivityManagerNative.getDefault().checkUriPermission(
1953                    ContentProvider.getUriWithoutUserId(uri), pid, uid, modeFlags,
1954                    resolveUserId(uri));
1955        } catch (RemoteException e) {
1956            return PackageManager.PERMISSION_DENIED;
1957        }
1958    }
1959
1960    private int resolveUserId(Uri uri) {
1961        return ContentProvider.getUserIdFromUri(uri, getUserId());
1962    }
1963
1964    @Override
1965    public int checkCallingUriPermission(Uri uri, int modeFlags) {
1966        int pid = Binder.getCallingPid();
1967        if (pid != Process.myPid()) {
1968            return checkUriPermission(uri, pid,
1969                    Binder.getCallingUid(), modeFlags);
1970        }
1971        return PackageManager.PERMISSION_DENIED;
1972    }
1973
1974    @Override
1975    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
1976        return checkUriPermission(uri, Binder.getCallingPid(),
1977                Binder.getCallingUid(), modeFlags);
1978    }
1979
1980    @Override
1981    public int checkUriPermission(Uri uri, String readPermission,
1982            String writePermission, int pid, int uid, int modeFlags) {
1983        if (DEBUG) {
1984            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
1985                    + readPermission + " writePermission=" + writePermission
1986                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
1987        }
1988        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
1989            if (readPermission == null
1990                    || checkPermission(readPermission, pid, uid)
1991                    == PackageManager.PERMISSION_GRANTED) {
1992                return PackageManager.PERMISSION_GRANTED;
1993            }
1994        }
1995        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
1996            if (writePermission == null
1997                    || checkPermission(writePermission, pid, uid)
1998                    == PackageManager.PERMISSION_GRANTED) {
1999                return PackageManager.PERMISSION_GRANTED;
2000            }
2001        }
2002        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
2003                : PackageManager.PERMISSION_DENIED;
2004    }
2005
2006    private String uriModeFlagToString(int uriModeFlags) {
2007        StringBuilder builder = new StringBuilder();
2008        if ((uriModeFlags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
2009            builder.append("read and ");
2010        }
2011        if ((uriModeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
2012            builder.append("write and ");
2013        }
2014        if ((uriModeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0) {
2015            builder.append("persistable and ");
2016        }
2017        if ((uriModeFlags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0) {
2018            builder.append("prefix and ");
2019        }
2020
2021        if (builder.length() > 5) {
2022            builder.setLength(builder.length() - 5);
2023            return builder.toString();
2024        } else {
2025            throw new IllegalArgumentException("Unknown permission mode flags: " + uriModeFlags);
2026        }
2027    }
2028
2029    private void enforceForUri(
2030            int modeFlags, int resultOfCheck, boolean selfToo,
2031            int uid, Uri uri, String message) {
2032        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
2033            throw new SecurityException(
2034                    (message != null ? (message + ": ") : "") +
2035                    (selfToo
2036                     ? "Neither user " + uid + " nor current process has "
2037                     : "User " + uid + " does not have ") +
2038                    uriModeFlagToString(modeFlags) +
2039                    " permission on " +
2040                    uri +
2041                    ".");
2042        }
2043    }
2044
2045    public void enforceUriPermission(
2046            Uri uri, int pid, int uid, int modeFlags, String message) {
2047        enforceForUri(
2048                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
2049                false, uid, uri, message);
2050    }
2051
2052    public void enforceCallingUriPermission(
2053            Uri uri, int modeFlags, String message) {
2054        enforceForUri(
2055                modeFlags, checkCallingUriPermission(uri, modeFlags),
2056                false,
2057                Binder.getCallingUid(), uri, message);
2058    }
2059
2060    public void enforceCallingOrSelfUriPermission(
2061            Uri uri, int modeFlags, String message) {
2062        enforceForUri(
2063                modeFlags,
2064                checkCallingOrSelfUriPermission(uri, modeFlags), true,
2065                Binder.getCallingUid(), uri, message);
2066    }
2067
2068    public void enforceUriPermission(
2069            Uri uri, String readPermission, String writePermission,
2070            int pid, int uid, int modeFlags, String message) {
2071        enforceForUri(modeFlags,
2072                      checkUriPermission(
2073                              uri, readPermission, writePermission, pid, uid,
2074                              modeFlags),
2075                      false,
2076                      uid,
2077                      uri,
2078                      message);
2079    }
2080
2081    /**
2082     * Logs a warning if the system process directly called a method such as
2083     * {@link #startService(Intent)} instead of {@link #startServiceAsUser(Intent, UserHandle)}.
2084     * The "AsUser" variants allow us to properly enforce the user's restrictions.
2085     */
2086    private void warnIfCallingFromSystemProcess() {
2087        if (Process.myUid() == Process.SYSTEM_UID) {
2088            Slog.w(TAG, "Calling a method in the system process without a qualified user: "
2089                    + Debug.getCallers(5));
2090        }
2091    }
2092
2093    @Override
2094    public Context createApplicationContext(ApplicationInfo application, int flags)
2095            throws NameNotFoundException {
2096        LoadedApk pi = mMainThread.getPackageInfo(application, mResources.getCompatibilityInfo(),
2097                flags | CONTEXT_REGISTER_PACKAGE);
2098        if (pi != null) {
2099            final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
2100            ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken,
2101                    new UserHandle(UserHandle.getUserId(application.uid)), restricted,
2102                    mDisplay, mOverrideConfiguration);
2103            if (c.mResources != null) {
2104                return c;
2105            }
2106        }
2107
2108        throw new PackageManager.NameNotFoundException(
2109                "Application package " + application.packageName + " not found");
2110    }
2111
2112    @Override
2113    public Context createPackageContext(String packageName, int flags)
2114            throws NameNotFoundException {
2115        return createPackageContextAsUser(packageName, flags,
2116                mUser != null ? mUser : Process.myUserHandle());
2117    }
2118
2119    @Override
2120    public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
2121            throws NameNotFoundException {
2122        final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
2123        if (packageName.equals("system") || packageName.equals("android")) {
2124            return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
2125                    user, restricted, mDisplay, mOverrideConfiguration);
2126        }
2127
2128        LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(),
2129                flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier());
2130        if (pi != null) {
2131            ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken,
2132                    user, restricted, mDisplay, mOverrideConfiguration);
2133            if (c.mResources != null) {
2134                return c;
2135            }
2136        }
2137
2138        // Should be a better exception.
2139        throw new PackageManager.NameNotFoundException(
2140                "Application package " + packageName + " not found");
2141    }
2142
2143    @Override
2144    public Context createConfigurationContext(Configuration overrideConfiguration) {
2145        if (overrideConfiguration == null) {
2146            throw new IllegalArgumentException("overrideConfiguration must not be null");
2147        }
2148
2149        return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
2150                mUser, mRestricted, mDisplay, overrideConfiguration);
2151    }
2152
2153    @Override
2154    public Context createDisplayContext(Display display) {
2155        if (display == null) {
2156            throw new IllegalArgumentException("display must not be null");
2157        }
2158
2159        return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
2160                mUser, mRestricted, display, mOverrideConfiguration);
2161    }
2162
2163    private int getDisplayId() {
2164        return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
2165    }
2166
2167    @Override
2168    public boolean isRestricted() {
2169        return mRestricted;
2170    }
2171
2172    @Override
2173    public DisplayAdjustments getDisplayAdjustments(int displayId) {
2174        return mDisplayAdjustments;
2175    }
2176
2177    private File getDataDirFile() {
2178        if (mPackageInfo != null) {
2179            return mPackageInfo.getDataDirFile();
2180        }
2181        throw new RuntimeException("Not supported in system context");
2182    }
2183
2184    @Override
2185    public File getDir(String name, int mode) {
2186        name = "app_" + name;
2187        File file = makeFilename(getDataDirFile(), name);
2188        if (!file.exists()) {
2189            file.mkdir();
2190            setFilePermissionsFromMode(file.getPath(), mode,
2191                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
2192        }
2193        return file;
2194    }
2195
2196    /** {@hide} */
2197    public int getUserId() {
2198        return mUser.getIdentifier();
2199    }
2200
2201    static ContextImpl createSystemContext(ActivityThread mainThread) {
2202        LoadedApk packageInfo = new LoadedApk(mainThread);
2203        ContextImpl context = new ContextImpl(null, mainThread,
2204                packageInfo, null, null, false, null, null);
2205        context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
2206                context.mResourcesManager.getDisplayMetricsLocked(Display.DEFAULT_DISPLAY));
2207        return context;
2208    }
2209
2210    static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
2211        if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
2212        return new ContextImpl(null, mainThread,
2213                packageInfo, null, null, false, null, null);
2214    }
2215
2216    static ContextImpl createActivityContext(ActivityThread mainThread,
2217            LoadedApk packageInfo, IBinder activityToken) {
2218        if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
2219        if (activityToken == null) throw new IllegalArgumentException("activityInfo");
2220        return new ContextImpl(null, mainThread,
2221                packageInfo, activityToken, null, false, null, null);
2222    }
2223
2224    private ContextImpl(ContextImpl container, ActivityThread mainThread,
2225            LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted,
2226            Display display, Configuration overrideConfiguration) {
2227        mOuterContext = this;
2228
2229        mMainThread = mainThread;
2230        mActivityToken = activityToken;
2231        mRestricted = restricted;
2232
2233        if (user == null) {
2234            user = Process.myUserHandle();
2235        }
2236        mUser = user;
2237
2238        mPackageInfo = packageInfo;
2239        mResourcesManager = ResourcesManager.getInstance();
2240        mDisplay = display;
2241        mOverrideConfiguration = overrideConfiguration;
2242
2243        final int displayId = getDisplayId();
2244        CompatibilityInfo compatInfo = null;
2245        if (container != null) {
2246            compatInfo = container.getDisplayAdjustments(displayId).getCompatibilityInfo();
2247        }
2248        if (compatInfo == null && displayId == Display.DEFAULT_DISPLAY) {
2249            compatInfo = packageInfo.getCompatibilityInfo();
2250        }
2251        mDisplayAdjustments.setCompatibilityInfo(compatInfo);
2252        mDisplayAdjustments.setActivityToken(activityToken);
2253
2254        Resources resources = packageInfo.getResources(mainThread);
2255        if (resources != null) {
2256            if (activityToken != null
2257                    || displayId != Display.DEFAULT_DISPLAY
2258                    || overrideConfiguration != null
2259                    || (compatInfo != null && compatInfo.applicationScale
2260                            != resources.getCompatibilityInfo().applicationScale)) {
2261                resources = mResourcesManager.getTopLevelResources(packageInfo.getResDir(),
2262                        packageInfo.getSplitResDirs(), packageInfo.getOverlayDirs(),
2263                        packageInfo.getApplicationInfo().sharedLibraryFiles, displayId,
2264                        overrideConfiguration, compatInfo, activityToken);
2265            }
2266        }
2267        mResources = resources;
2268
2269        if (container != null) {
2270            mBasePackageName = container.mBasePackageName;
2271            mOpPackageName = container.mOpPackageName;
2272        } else {
2273            mBasePackageName = packageInfo.mPackageName;
2274            ApplicationInfo ainfo = packageInfo.getApplicationInfo();
2275            if (ainfo.uid == Process.SYSTEM_UID && ainfo.uid != Process.myUid()) {
2276                // Special case: system components allow themselves to be loaded in to other
2277                // processes.  For purposes of app ops, we must then consider the context as
2278                // belonging to the package of this process, not the system itself, otherwise
2279                // the package+uid verifications in app ops will fail.
2280                mOpPackageName = ActivityThread.currentPackageName();
2281            } else {
2282                mOpPackageName = mBasePackageName;
2283            }
2284        }
2285
2286        mContentResolver = new ApplicationContentResolver(this, mainThread, user);
2287    }
2288
2289    void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
2290        mPackageInfo.installSystemApplicationInfo(info, classLoader);
2291    }
2292
2293    final void scheduleFinalCleanup(String who, String what) {
2294        mMainThread.scheduleContextCleanup(this, who, what);
2295    }
2296
2297    final void performFinalCleanup(String who, String what) {
2298        //Log.i(TAG, "Cleanup up context: " + this);
2299        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
2300    }
2301
2302    final Context getReceiverRestrictedContext() {
2303        if (mReceiverRestrictedContext != null) {
2304            return mReceiverRestrictedContext;
2305        }
2306        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
2307    }
2308
2309    final void setOuterContext(Context context) {
2310        mOuterContext = context;
2311    }
2312
2313    final Context getOuterContext() {
2314        return mOuterContext;
2315    }
2316
2317    final IBinder getActivityToken() {
2318        return mActivityToken;
2319    }
2320
2321    static void setFilePermissionsFromMode(String name, int mode,
2322            int extraPermissions) {
2323        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
2324            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
2325            |extraPermissions;
2326        if ((mode&MODE_WORLD_READABLE) != 0) {
2327            perms |= FileUtils.S_IROTH;
2328        }
2329        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
2330            perms |= FileUtils.S_IWOTH;
2331        }
2332        if (DEBUG) {
2333            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
2334                  + ", perms=0x" + Integer.toHexString(perms));
2335        }
2336        FileUtils.setPermissions(name, perms, -1, -1);
2337    }
2338
2339    private File validateFilePath(String name, boolean createDirectory) {
2340        File dir;
2341        File f;
2342
2343        if (name.charAt(0) == File.separatorChar) {
2344            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
2345            dir = new File(dirPath);
2346            name = name.substring(name.lastIndexOf(File.separatorChar));
2347            f = new File(dir, name);
2348        } else {
2349            dir = getDatabasesDir();
2350            f = makeFilename(dir, name);
2351        }
2352
2353        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
2354            FileUtils.setPermissions(dir.getPath(),
2355                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
2356                -1, -1);
2357        }
2358
2359        return f;
2360    }
2361
2362    private File makeFilename(File base, String name) {
2363        if (name.indexOf(File.separatorChar) < 0) {
2364            return new File(base, name);
2365        }
2366        throw new IllegalArgumentException(
2367                "File " + name + " contains a path separator");
2368    }
2369
2370    /**
2371     * Ensure that given directories exist, trying to create them if missing. If
2372     * unable to create, they are filtered by replacing with {@code null}.
2373     */
2374    private File[] ensureDirsExistOrFilter(File[] dirs) {
2375        File[] result = new File[dirs.length];
2376        for (int i = 0; i < dirs.length; i++) {
2377            File dir = dirs[i];
2378            if (!dir.exists()) {
2379                if (!dir.mkdirs()) {
2380                    // recheck existence in case of cross-process race
2381                    if (!dir.exists()) {
2382                        // Failing to mkdir() may be okay, since we might not have
2383                        // enough permissions; ask vold to create on our behalf.
2384                        final IMountService mount = IMountService.Stub.asInterface(
2385                                ServiceManager.getService("mount"));
2386                        int res = -1;
2387                        try {
2388                            res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
2389                        } catch (RemoteException e) {
2390                        }
2391                        if (res != 0) {
2392                            Log.w(TAG, "Failed to ensure directory: " + dir);
2393                            dir = null;
2394                        }
2395                    }
2396                }
2397            }
2398            result[i] = dir;
2399        }
2400        return result;
2401    }
2402
2403    // ----------------------------------------------------------------------
2404    // ----------------------------------------------------------------------
2405    // ----------------------------------------------------------------------
2406
2407    private static final class ApplicationContentResolver extends ContentResolver {
2408        private final ActivityThread mMainThread;
2409        private final UserHandle mUser;
2410
2411        public ApplicationContentResolver(
2412                Context context, ActivityThread mainThread, UserHandle user) {
2413            super(context);
2414            mMainThread = Preconditions.checkNotNull(mainThread);
2415            mUser = Preconditions.checkNotNull(user);
2416        }
2417
2418        @Override
2419        protected IContentProvider acquireProvider(Context context, String auth) {
2420            return mMainThread.acquireProvider(context,
2421                    ContentProvider.getAuthorityWithoutUserId(auth),
2422                    resolveUserIdFromAuthority(auth), true);
2423        }
2424
2425        @Override
2426        protected IContentProvider acquireExistingProvider(Context context, String auth) {
2427            return mMainThread.acquireExistingProvider(context,
2428                    ContentProvider.getAuthorityWithoutUserId(auth),
2429                    resolveUserIdFromAuthority(auth), true);
2430        }
2431
2432        @Override
2433        public boolean releaseProvider(IContentProvider provider) {
2434            return mMainThread.releaseProvider(provider, true);
2435        }
2436
2437        @Override
2438        protected IContentProvider acquireUnstableProvider(Context c, String auth) {
2439            return mMainThread.acquireProvider(c,
2440                    ContentProvider.getAuthorityWithoutUserId(auth),
2441                    resolveUserIdFromAuthority(auth), false);
2442        }
2443
2444        @Override
2445        public boolean releaseUnstableProvider(IContentProvider icp) {
2446            return mMainThread.releaseProvider(icp, false);
2447        }
2448
2449        @Override
2450        public void unstableProviderDied(IContentProvider icp) {
2451            mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
2452        }
2453
2454        @Override
2455        public void appNotRespondingViaProvider(IContentProvider icp) {
2456            mMainThread.appNotRespondingViaProvider(icp.asBinder());
2457        }
2458
2459        /** @hide */
2460        protected int resolveUserIdFromAuthority(String auth) {
2461            return ContentProvider.getUserIdFromAuthority(auth, mUser.getIdentifier());
2462        }
2463    }
2464}
2465