blob: 3fc82faa90cd2301c6fd4651da25ee2659529df4 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.app;
18
svetoslavganov75986cf2009-05-14 22:28:01 -070019import com.android.internal.policy.PolicyManager;
Jeff Sharkey6d515712012-09-20 16:06:08 -070020import com.android.internal.util.Preconditions;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021
Matthew Xieddf7e472013-03-01 18:41:02 -080022import android.bluetooth.BluetoothManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023import android.content.BroadcastReceiver;
24import android.content.ComponentName;
25import android.content.ContentResolver;
26import android.content.Context;
27import android.content.ContextWrapper;
28import android.content.IContentProvider;
29import android.content.Intent;
30import android.content.IntentFilter;
Suchi Amalapurapu1ccac752009-06-12 10:09:58 -070031import android.content.IIntentReceiver;
32import android.content.IntentSender;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033import android.content.ReceiverCallNotAllowedException;
34import android.content.ServiceConnection;
35import android.content.SharedPreferences;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036import android.content.pm.ApplicationInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080037import android.content.pm.IPackageManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080038import android.content.pm.PackageManager;
Jeff Sharkey6d515712012-09-20 16:06:08 -070039import android.content.pm.PackageManager.NameNotFoundException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080040import android.content.res.AssetManager;
Dianne Hackborn5be8de32011-05-24 18:11:57 -070041import android.content.res.CompatibilityInfo;
Dianne Hackborn756220b2012-08-14 16:45:30 -070042import android.content.res.Configuration;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043import android.content.res.Resources;
Vasu Nori74f170f2010-06-01 18:06:18 -070044import android.database.DatabaseErrorHandler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045import android.database.sqlite.SQLiteDatabase;
46import android.database.sqlite.SQLiteDatabase.CursorFactory;
47import android.graphics.Bitmap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048import android.graphics.drawable.Drawable;
Mike Lockwoodb01e8bf2011-08-29 20:11:07 -040049import android.hardware.ISerialManager;
Mike Lockwoodb01e8bf2011-08-29 20:11:07 -040050import android.hardware.SerialManager;
Jeff Brown25157e42012-04-16 12:13:05 -070051import android.hardware.SystemSensorManager;
Jeff Brownfa25bf52012-07-23 19:26:30 -070052import android.hardware.display.DisplayManager;
Jeff Brown9df6e7a2012-04-05 11:49:26 -070053import android.hardware.input.InputManager;
Mike Lockwoodc4308f02011-03-01 08:04:54 -080054import android.hardware.usb.IUsbManager;
55import android.hardware.usb.UsbManager;
Bai Taoa58a8752010-07-13 15:32:16 +080056import android.location.CountryDetector;
57import android.location.ICountryDetector;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080058import android.location.ILocationManager;
59import android.location.LocationManager;
60import android.media.AudioManager;
Dianne Hackbornb58b8f82012-06-11 15:08:39 -070061import android.media.MediaRouter;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080062import android.net.ConnectivityManager;
63import android.net.IConnectivityManager;
Jeff Sharkey1a303952011-06-16 13:04:20 -070064import android.net.INetworkPolicyManager;
65import android.net.NetworkPolicyManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080066import android.net.Uri;
Irfan Sheriff7d024d32012-03-22 17:01:39 -070067import android.net.nsd.INsdManager;
68import android.net.nsd.NsdManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080069import android.net.wifi.IWifiManager;
70import android.net.wifi.WifiManager;
repo sync55bc5f32011-06-24 14:23:07 -070071import android.net.wifi.p2p.IWifiP2pManager;
72import android.net.wifi.p2p.WifiP2pManager;
Nick Pelly50b4d8f2010-12-07 22:40:28 -080073import android.nfc.NfcManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074import android.os.Binder;
75import android.os.Bundle;
Amith Yamasanicd757062012-10-19 18:23:52 -070076import android.os.Debug;
Dan Egnorf18a01c2009-11-12 11:32:50 -080077import android.os.DropBoxManager;
Oscar Montemayor539d3c42010-01-29 15:27:00 -080078import android.os.Environment;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080079import android.os.FileUtils;
80import android.os.Handler;
81import android.os.IBinder;
82import android.os.IPowerManager;
Amith Yamasani258848d2012-08-10 17:06:33 -070083import android.os.IUserManager;
svetoslavganov75986cf2009-05-14 22:28:01 -070084import android.os.Looper;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085import android.os.PowerManager;
86import android.os.Process;
svetoslavganov75986cf2009-05-14 22:28:01 -070087import android.os.RemoteException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088import android.os.ServiceManager;
Dianne Hackbornf02b60a2012-08-16 10:48:27 -070089import android.os.UserHandle;
Jeff Brownc2346132012-04-13 01:55:38 -070090import android.os.SystemVibrator;
Amith Yamasani258848d2012-08-10 17:06:33 -070091import android.os.UserManager;
San Mehatb1043402010-02-05 08:26:50 -080092import android.os.storage.StorageManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093import android.telephony.TelephonyManager;
Dianne Hackborn9f531192010-08-04 17:48:03 -070094import android.content.ClipboardManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095import android.util.AndroidRuntimeException;
96import android.util.Log;
Amith Yamasanicd757062012-10-19 18:23:52 -070097import android.util.Slog;
Jeff Brown98365d72012-08-19 20:30:52 -070098import android.view.CompatibilityInfoHolder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099import android.view.ContextThemeWrapper;
Jeff Brown98365d72012-08-19 20:30:52 -0700100import android.view.Display;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800101import android.view.WindowManagerImpl;
svetoslavganov75986cf2009-05-14 22:28:01 -0700102import android.view.accessibility.AccessibilityManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103import android.view.inputmethod.InputMethodManager;
satok988323c2011-06-22 16:38:13 +0900104import android.view.textservice.TextServicesManager;
Fred Quintana60307342009-03-24 22:48:12 -0700105import android.accounts.AccountManager;
106import android.accounts.IAccountManager;
Dianne Hackborn87bba1e2010-02-26 17:25:54 -0800107import android.app.admin.DevicePolicyManager;
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800108
109import com.android.internal.app.IAppOpsService;
Dan Egnorf18a01c2009-11-12 11:32:50 -0800110import com.android.internal.os.IDropBoxManagerService;
Dan Egnor95240272009-10-27 18:23:39 -0700111
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800112import java.io.File;
113import java.io.FileInputStream;
114import java.io.FileNotFoundException;
115import java.io.FileOutputStream;
116import java.io.IOException;
117import java.io.InputStream;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800118import java.util.ArrayList;
119import java.util.HashMap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800121class ReceiverRestrictedContext extends ContextWrapper {
122 ReceiverRestrictedContext(Context base) {
123 super(base);
124 }
125
126 @Override
127 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
128 return registerReceiver(receiver, filter, null, null);
129 }
130
131 @Override
132 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
133 String broadcastPermission, Handler scheduler) {
Jeff Sharkey27bd34d2012-09-16 12:49:00 -0700134 if (receiver == null) {
135 // Allow retrieving current sticky broadcast; this is safe since we
136 // aren't actually registering a receiver.
137 return super.registerReceiver(null, filter, broadcastPermission, scheduler);
138 } else {
139 throw new ReceiverCallNotAllowedException(
140 "BroadcastReceiver components are not allowed to register to receive intents");
141 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800142 }
143
144 @Override
Dianne Hackborn20e80982012-08-31 19:00:44 -0700145 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
146 IntentFilter filter, String broadcastPermission, Handler scheduler) {
Jeff Sharkey27bd34d2012-09-16 12:49:00 -0700147 if (receiver == null) {
148 // Allow retrieving current sticky broadcast; this is safe since we
149 // aren't actually registering a receiver.
150 return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler);
151 } else {
152 throw new ReceiverCallNotAllowedException(
153 "BroadcastReceiver components are not allowed to register to receive intents");
154 }
Dianne Hackborn20e80982012-08-31 19:00:44 -0700155 }
156
157 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 public boolean bindService(Intent service, ServiceConnection conn, int flags) {
159 throw new ReceiverCallNotAllowedException(
Jeff Sharkey27bd34d2012-09-16 12:49:00 -0700160 "BroadcastReceiver components are not allowed to bind to services");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161 }
162}
163
164/**
Dianne Hackborn21556372010-02-04 16:34:40 -0800165 * Common implementation of Context API, which provides the base
166 * context object for Activity and other application components.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800167 */
Dianne Hackborn21556372010-02-04 16:34:40 -0800168class ContextImpl extends Context {
Dianne Hackborn40e9f292012-11-27 19:12:23 -0800169 private final static String TAG = "ContextImpl";
Mitsuru Oshima569076c2009-07-02 20:06:08 -0700170 private final static boolean DEBUG = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800171
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -0700172 private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
173 new HashMap<String, SharedPreferencesImpl>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800174
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700175 /*package*/ LoadedApk mPackageInfo;
Dianne Hackborn6c418d52011-06-29 14:05:33 -0700176 private String mBasePackageName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177 private Resources mResources;
178 /*package*/ ActivityThread mMainThread;
179 private Context mOuterContext;
180 private IBinder mActivityToken = null;
181 private ApplicationContentResolver mContentResolver;
182 private int mThemeResource = 0;
183 private Resources.Theme mTheme = null;
184 private PackageManager mPackageManager;
Jeff Browna492c3a2012-08-23 19:48:44 -0700185 private Display mDisplay; // may be null if default display
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800186 private Context mReceiverRestrictedContext = null;
Romain Guy870e09f2009-07-06 16:35:25 -0700187 private boolean mRestricted;
Jeff Sharkey6d515712012-09-20 16:06:08 -0700188 private UserHandle mUser;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189
190 private final Object mSync = new Object();
191
192 private File mDatabasesDir;
193 private File mPreferencesDir;
194 private File mFilesDir;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 private File mCacheDir;
Dianne Hackborn805fd7e2011-01-16 18:30:29 -0800196 private File mObbDir;
Dianne Hackborne83cefce2010-02-04 17:38:14 -0800197 private File mExternalFilesDir;
198 private File mExternalCacheDir;
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200199
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800200 private static final String[] EMPTY_FILE_LIST = {};
201
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800202 /**
203 * Override this class when the system service constructor needs a
204 * ContextImpl. Else, use StaticServiceFetcher below.
205 */
206 /*package*/ static class ServiceFetcher {
207 int mContextCacheIndex = -1;
208
209 /**
210 * Main entrypoint; only override if you don't need caching.
211 */
212 public Object getService(ContextImpl ctx) {
213 ArrayList<Object> cache = ctx.mServiceCache;
214 Object service;
215 synchronized (cache) {
216 if (cache.size() == 0) {
217 // Initialize the cache vector on first access.
218 // At this point sNextPerContextServiceCacheIndex
219 // is the number of potential services that are
220 // cached per-Context.
221 for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
222 cache.add(null);
223 }
224 } else {
225 service = cache.get(mContextCacheIndex);
226 if (service != null) {
227 return service;
228 }
229 }
230 service = createService(ctx);
231 cache.set(mContextCacheIndex, service);
232 return service;
233 }
234 }
235
236 /**
237 * Override this to create a new per-Context instance of the
238 * service. getService() will handle locking and caching.
239 */
240 public Object createService(ContextImpl ctx) {
241 throw new RuntimeException("Not implemented");
242 }
243 }
244
245 /**
246 * Override this class for services to be cached process-wide.
247 */
248 abstract static class StaticServiceFetcher extends ServiceFetcher {
249 private Object mCachedInstance;
250
251 @Override
252 public final Object getService(ContextImpl unused) {
253 synchronized (StaticServiceFetcher.this) {
254 Object service = mCachedInstance;
255 if (service != null) {
256 return service;
257 }
258 return mCachedInstance = createStaticService();
259 }
260 }
261
262 public abstract Object createStaticService();
263 }
264
265 private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
266 new HashMap<String, ServiceFetcher>();
267
268 private static int sNextPerContextServiceCacheIndex = 0;
269 private static void registerService(String serviceName, ServiceFetcher fetcher) {
270 if (!(fetcher instanceof StaticServiceFetcher)) {
271 fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
272 }
273 SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
274 }
275
276 // This one's defined separately and given a variable name so it
277 // can be re-used by getWallpaperManager(), avoiding a HashMap
278 // lookup.
279 private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
280 public Object createService(ContextImpl ctx) {
281 return new WallpaperManager(ctx.getOuterContext(),
282 ctx.mMainThread.getHandler());
283 }};
284
285 static {
286 registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
287 public Object getService(ContextImpl ctx) {
288 return AccessibilityManager.getInstance(ctx);
289 }});
290
291 registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
292 public Object createService(ContextImpl ctx) {
293 IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
294 IAccountManager service = IAccountManager.Stub.asInterface(b);
295 return new AccountManager(ctx, service);
296 }});
297
298 registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
299 public Object createService(ContextImpl ctx) {
300 return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
301 }});
302
303 registerService(ALARM_SERVICE, new StaticServiceFetcher() {
304 public Object createStaticService() {
305 IBinder b = ServiceManager.getService(ALARM_SERVICE);
306 IAlarmManager service = IAlarmManager.Stub.asInterface(b);
307 return new AlarmManager(service);
308 }});
309
310 registerService(AUDIO_SERVICE, new ServiceFetcher() {
311 public Object createService(ContextImpl ctx) {
312 return new AudioManager(ctx);
313 }});
314
Dianne Hackbornb58b8f82012-06-11 15:08:39 -0700315 registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() {
316 public Object createService(ContextImpl ctx) {
317 return new MediaRouter(ctx);
318 }});
319
Jaikumar Ganesh1abb1cb2012-01-25 16:14:50 -0800320 registerService(BLUETOOTH_SERVICE, new ServiceFetcher() {
321 public Object createService(ContextImpl ctx) {
Matthew Xieddf7e472013-03-01 18:41:02 -0800322 return new BluetoothManager(ctx);
Jaikumar Ganesh1abb1cb2012-01-25 16:14:50 -0800323 }});
324
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800325 registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
326 public Object createService(ContextImpl ctx) {
327 return new ClipboardManager(ctx.getOuterContext(),
328 ctx.mMainThread.getHandler());
329 }});
330
331 registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
332 public Object createStaticService() {
333 IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
334 return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
335 }});
336
337 registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
338 public Object createStaticService() {
339 IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
340 return new CountryDetector(ICountryDetector.Stub.asInterface(b));
341 }});
342
343 registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
344 public Object createService(ContextImpl ctx) {
345 return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
346 }});
347
348 registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
349 public Object createService(ContextImpl ctx) {
350 return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
351 }});
352
Nick Pellyd2507462010-12-13 12:22:34 -0800353 registerService(NFC_SERVICE, new ServiceFetcher() {
354 public Object createService(ContextImpl ctx) {
355 return new NfcManager(ctx);
356 }});
357
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800358 registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
359 public Object createStaticService() {
360 return createDropBoxManager();
361 }});
362
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700363 registerService(INPUT_SERVICE, new StaticServiceFetcher() {
364 public Object createStaticService() {
365 return InputManager.getInstance();
Jeff Brownac143512012-04-05 18:57:33 -0700366 }});
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700367
Jeff Brownbd6e1502012-08-28 03:27:37 -0700368 registerService(DISPLAY_SERVICE, new ServiceFetcher() {
369 @Override
370 public Object createService(ContextImpl ctx) {
371 return new DisplayManager(ctx.getOuterContext());
372 }});
Jeff Brownfa25bf52012-07-23 19:26:30 -0700373
Jeff Brownf9e989d2013-04-04 23:04:03 -0700374 registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() {
375 public Object createStaticService() {
376 return InputMethodManager.getInstance();
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800377 }});
378
satok988323c2011-06-22 16:38:13 +0900379 registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
380 public Object createService(ContextImpl ctx) {
381 return TextServicesManager.getInstance();
382 }});
383
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800384 registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
385 public Object getService(ContextImpl ctx) {
386 // TODO: why isn't this caching it? It wasn't
387 // before, so I'm preserving the old behavior and
388 // using getService(), instead of createService()
389 // which would do the caching.
390 return new KeyguardManager();
391 }});
392
393 registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
394 public Object createService(ContextImpl ctx) {
395 return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
396 }});
397
Nick Pellye0fd6932012-07-11 10:26:13 -0700398 registerService(LOCATION_SERVICE, new ServiceFetcher() {
399 public Object createService(ContextImpl ctx) {
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800400 IBinder b = ServiceManager.getService(LOCATION_SERVICE);
Nick Pellye0fd6932012-07-11 10:26:13 -0700401 return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800402 }});
403
Jeff Sharkey1a303952011-06-16 13:04:20 -0700404 registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
405 @Override
406 public Object createService(ContextImpl ctx) {
407 return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
408 ServiceManager.getService(NETWORK_POLICY_SERVICE)));
409 }
410 });
411
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800412 registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
413 public Object createService(ContextImpl ctx) {
414 final Context outerContext = ctx.getOuterContext();
415 return new NotificationManager(
416 new ContextThemeWrapper(outerContext,
Dianne Hackbornd922ae02011-01-14 11:43:24 -0800417 Resources.selectSystemTheme(0,
418 outerContext.getApplicationInfo().targetSdkVersion,
419 com.android.internal.R.style.Theme_Dialog,
Adam Powell6e90a362011-08-14 16:48:32 -0700420 com.android.internal.R.style.Theme_Holo_Dialog,
421 com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800422 ctx.mMainThread.getHandler());
423 }});
424
Irfan Sheriff7d024d32012-03-22 17:01:39 -0700425 registerService(NSD_SERVICE, new ServiceFetcher() {
426 @Override
427 public Object createService(ContextImpl ctx) {
428 IBinder b = ServiceManager.getService(NSD_SERVICE);
429 INsdManager service = INsdManager.Stub.asInterface(b);
Irfan Sheriff22af38c2012-05-03 16:44:27 -0700430 return new NsdManager(ctx.getOuterContext(), service);
Irfan Sheriff7d024d32012-03-22 17:01:39 -0700431 }});
432
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800433 // Note: this was previously cached in a static variable, but
434 // constructed using mMainThread.getHandler(), so converting
435 // it to be a regular Context-cached service...
436 registerService(POWER_SERVICE, new ServiceFetcher() {
437 public Object createService(ContextImpl ctx) {
438 IBinder b = ServiceManager.getService(POWER_SERVICE);
439 IPowerManager service = IPowerManager.Stub.asInterface(b);
Jeff Brown96307042012-07-27 15:51:34 -0700440 return new PowerManager(ctx.getOuterContext(),
441 service, ctx.mMainThread.getHandler());
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800442 }});
443
444 registerService(SEARCH_SERVICE, new ServiceFetcher() {
445 public Object createService(ContextImpl ctx) {
446 return new SearchManager(ctx.getOuterContext(),
447 ctx.mMainThread.getHandler());
448 }});
449
450 registerService(SENSOR_SERVICE, new ServiceFetcher() {
451 public Object createService(ContextImpl ctx) {
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700452 return new SystemSensorManager(ctx.getOuterContext(),
453 ctx.mMainThread.getHandler().getLooper());
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800454 }});
455
456 registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
457 public Object createService(ContextImpl ctx) {
458 return new StatusBarManager(ctx.getOuterContext());
459 }});
460
461 registerService(STORAGE_SERVICE, new ServiceFetcher() {
462 public Object createService(ContextImpl ctx) {
463 try {
Jeff Sharkeybe722152013-02-15 16:56:38 -0800464 return new StorageManager(
465 ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper());
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800466 } catch (RemoteException rex) {
467 Log.e(TAG, "Failed to create StorageManager", rex);
468 return null;
469 }
470 }});
471
472 registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
473 public Object createService(ContextImpl ctx) {
474 return new TelephonyManager(ctx.getOuterContext());
475 }});
476
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800477 registerService(UI_MODE_SERVICE, new ServiceFetcher() {
478 public Object createService(ContextImpl ctx) {
479 return new UiModeManager();
480 }});
481
Mike Lockwood3a68b832011-03-08 10:08:59 -0500482 registerService(USB_SERVICE, new ServiceFetcher() {
483 public Object createService(ContextImpl ctx) {
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500484 IBinder b = ServiceManager.getService(USB_SERVICE);
Mike Lockwood3a68b832011-03-08 10:08:59 -0500485 return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500486 }});
487
Mike Lockwoodb01e8bf2011-08-29 20:11:07 -0400488 registerService(SERIAL_SERVICE, new ServiceFetcher() {
489 public Object createService(ContextImpl ctx) {
490 IBinder b = ServiceManager.getService(SERIAL_SERVICE);
491 return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
492 }});
493
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800494 registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
495 public Object createService(ContextImpl ctx) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800496 return new SystemVibrator(ctx);
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800497 }});
498
499 registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
500
501 registerService(WIFI_SERVICE, new ServiceFetcher() {
502 public Object createService(ContextImpl ctx) {
503 IBinder b = ServiceManager.getService(WIFI_SERVICE);
504 IWifiManager service = IWifiManager.Stub.asInterface(b);
Irfan Sheriff88759bb2012-07-02 15:58:28 -0700505 return new WifiManager(ctx.getOuterContext(), service);
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800506 }});
507
repo sync55bc5f32011-06-24 14:23:07 -0700508 registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
509 public Object createService(ContextImpl ctx) {
510 IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
511 IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
512 return new WifiP2pManager(service);
513 }});
514
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800515 registerService(WINDOW_SERVICE, new ServiceFetcher() {
516 public Object getService(ContextImpl ctx) {
Jeff Browna492c3a2012-08-23 19:48:44 -0700517 Display display = ctx.mDisplay;
518 if (display == null) {
519 DisplayManager dm = (DisplayManager)ctx.getOuterContext().getSystemService(
520 Context.DISPLAY_SERVICE);
521 display = dm.getDisplay(Display.DEFAULT_DISPLAY);
522 }
523 return new WindowManagerImpl(display);
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800524 }});
Amith Yamasani258848d2012-08-10 17:06:33 -0700525
526 registerService(USER_SERVICE, new ServiceFetcher() {
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800527 public Object createService(ContextImpl ctx) {
Amith Yamasani258848d2012-08-10 17:06:33 -0700528 IBinder b = ServiceManager.getService(USER_SERVICE);
529 IUserManager service = IUserManager.Stub.asInterface(b);
530 return new UserManager(ctx, service);
531 }});
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800532
533 registerService(APP_OPS_SERVICE, new ServiceFetcher() {
534 public Object createService(ContextImpl ctx) {
535 IBinder b = ServiceManager.getService(APP_OPS_SERVICE);
536 IAppOpsService service = IAppOpsService.Stub.asInterface(b);
537 return new AppOpsManager(ctx, service);
538 }});
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800539 }
540
Dianne Hackborn5fd21692011-06-07 14:09:47 -0700541 static ContextImpl getImpl(Context context) {
542 Context nextContext;
543 while ((context instanceof ContextWrapper) &&
544 (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
545 context = nextContext;
546 }
547 return (ContextImpl)context;
548 }
549
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -0800550 // The system service cache for the system services that are
551 // cached per-ContextImpl. Package-scoped to avoid accessor
552 // methods.
553 final ArrayList<Object> mServiceCache = new ArrayList<Object>();
554
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800555 @Override
556 public AssetManager getAssets() {
Dianne Hackborn756220b2012-08-14 16:45:30 -0700557 return getResources().getAssets();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800558 }
559
560 @Override
561 public Resources getResources() {
562 return mResources;
563 }
564
565 @Override
566 public PackageManager getPackageManager() {
567 if (mPackageManager != null) {
568 return mPackageManager;
569 }
570
571 IPackageManager pm = ActivityThread.getPackageManager();
572 if (pm != null) {
573 // Doesn't matter if we make more than one instance.
574 return (mPackageManager = new ApplicationPackageManager(this, pm));
575 }
576
577 return null;
578 }
579
580 @Override
581 public ContentResolver getContentResolver() {
582 return mContentResolver;
583 }
584
585 @Override
586 public Looper getMainLooper() {
587 return mMainThread.getLooper();
588 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200589
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800590 @Override
591 public Context getApplicationContext() {
Christopher Tateeb9e9ec2010-03-23 17:14:36 -0700592 return (mPackageInfo != null) ?
593 mPackageInfo.getApplication() : mMainThread.getApplication();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800594 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200595
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800596 @Override
597 public void setTheme(int resid) {
598 mThemeResource = resid;
599 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200600
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800601 @Override
Dianne Hackborn247fe742011-01-08 17:25:57 -0800602 public int getThemeResId() {
603 return mThemeResource;
604 }
605
606 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800607 public Resources.Theme getTheme() {
608 if (mTheme == null) {
Dianne Hackbornd922ae02011-01-14 11:43:24 -0800609 mThemeResource = Resources.selectDefaultTheme(mThemeResource,
610 getOuterContext().getApplicationInfo().targetSdkVersion);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800611 mTheme = mResources.newTheme();
612 mTheme.applyStyle(mThemeResource, true);
613 }
614 return mTheme;
615 }
616
617 @Override
618 public ClassLoader getClassLoader() {
619 return mPackageInfo != null ?
620 mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
621 }
622
623 @Override
624 public String getPackageName() {
625 if (mPackageInfo != null) {
626 return mPackageInfo.getPackageName();
627 }
Dianne Hackborn35654b62013-01-14 17:38:02 -0800628 // No mPackageInfo means this is a Context for the system itself,
629 // and this here is its name.
630 return "android";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800631 }
632
Dianne Hackbornd8e1dbb2013-01-17 17:47:37 -0800633 /** @hide */
634 @Override
635 public String getBasePackageName() {
636 return mBasePackageName != null ? mBasePackageName : getPackageName();
637 }
638
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800639 @Override
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700640 public ApplicationInfo getApplicationInfo() {
641 if (mPackageInfo != null) {
642 return mPackageInfo.getApplicationInfo();
643 }
644 throw new RuntimeException("Not supported in system context");
645 }
646
647 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800648 public String getPackageResourcePath() {
649 if (mPackageInfo != null) {
650 return mPackageInfo.getResDir();
651 }
652 throw new RuntimeException("Not supported in system context");
653 }
654
655 @Override
656 public String getPackageCodePath() {
657 if (mPackageInfo != null) {
658 return mPackageInfo.getAppDir();
659 }
660 throw new RuntimeException("Not supported in system context");
661 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200662
Joe Onorato23ecae32009-06-10 17:07:15 -0700663 public File getSharedPrefsFile(String name) {
664 return makeFilename(getPreferencesDir(), name + ".xml");
665 }
666
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800667 @Override
668 public SharedPreferences getSharedPreferences(String name, int mode) {
669 SharedPreferencesImpl sp;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800670 synchronized (sSharedPrefs) {
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -0700671 sp = sSharedPrefs.get(name);
Brad Fitzpatrick6194c532010-09-07 18:00:33 -0700672 if (sp == null) {
Brad Fitzpatrick4cd50b82010-12-01 17:31:45 -0800673 File prefsFile = getSharedPrefsFile(name);
674 sp = new SharedPreferencesImpl(prefsFile, mode);
Brad Fitzpatrick6194c532010-09-07 18:00:33 -0700675 sSharedPrefs.put(name, sp);
Brad Fitzpatrick6194c532010-09-07 18:00:33 -0700676 return sp;
677 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800678 }
Brad Fitzpatrick4e920f72010-12-14 11:52:13 -0800679 if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
680 getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
681 // If somebody else (some other process) changed the prefs
682 // file behind our back, we reload it. This has been the
683 // historical (if undocumented) behavior.
684 sp.startReloadIfChangedUnexpectedly();
685 }
Brad Fitzpatrick6194c532010-09-07 18:00:33 -0700686 return sp;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800687 }
688
689 private File getPreferencesDir() {
690 synchronized (mSync) {
691 if (mPreferencesDir == null) {
692 mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
693 }
694 return mPreferencesDir;
695 }
696 }
697
698 @Override
699 public FileInputStream openFileInput(String name)
700 throws FileNotFoundException {
701 File f = makeFilename(getFilesDir(), name);
702 return new FileInputStream(f);
703 }
704
705 @Override
706 public FileOutputStream openFileOutput(String name, int mode)
707 throws FileNotFoundException {
708 final boolean append = (mode&MODE_APPEND) != 0;
709 File f = makeFilename(getFilesDir(), name);
710 try {
711 FileOutputStream fos = new FileOutputStream(f, append);
712 setFilePermissionsFromMode(f.getPath(), mode, 0);
713 return fos;
714 } catch (FileNotFoundException e) {
715 }
716
717 File parent = f.getParentFile();
718 parent.mkdir();
719 FileUtils.setPermissions(
720 parent.getPath(),
721 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
722 -1, -1);
723 FileOutputStream fos = new FileOutputStream(f, append);
724 setFilePermissionsFromMode(f.getPath(), mode, 0);
725 return fos;
726 }
727
728 @Override
729 public boolean deleteFile(String name) {
730 File f = makeFilename(getFilesDir(), name);
731 return f.delete();
732 }
733
734 @Override
735 public File getFilesDir() {
736 synchronized (mSync) {
737 if (mFilesDir == null) {
738 mFilesDir = new File(getDataDirFile(), "files");
739 }
740 if (!mFilesDir.exists()) {
741 if(!mFilesDir.mkdirs()) {
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200742 Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800743 return null;
744 }
745 FileUtils.setPermissions(
746 mFilesDir.getPath(),
747 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
748 -1, -1);
749 }
750 return mFilesDir;
751 }
752 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200753
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800754 @Override
Dianne Hackborne83cefce2010-02-04 17:38:14 -0800755 public File getExternalFilesDir(String type) {
756 synchronized (mSync) {
757 if (mExternalFilesDir == null) {
758 mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
759 getPackageName());
760 }
761 if (!mExternalFilesDir.exists()) {
762 try {
763 (new File(Environment.getExternalStorageAndroidDataDir(),
764 ".nomedia")).createNewFile();
765 } catch (IOException e) {
766 }
767 if (!mExternalFilesDir.mkdirs()) {
768 Log.w(TAG, "Unable to create external files directory");
769 return null;
770 }
771 }
772 if (type == null) {
773 return mExternalFilesDir;
774 }
775 File dir = new File(mExternalFilesDir, type);
776 if (!dir.exists()) {
777 if (!dir.mkdirs()) {
778 Log.w(TAG, "Unable to create external media directory " + dir);
779 return null;
780 }
781 }
782 return dir;
783 }
784 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200785
Dianne Hackborne83cefce2010-02-04 17:38:14 -0800786 @Override
Dianne Hackborn805fd7e2011-01-16 18:30:29 -0800787 public File getObbDir() {
788 synchronized (mSync) {
789 if (mObbDir == null) {
790 mObbDir = Environment.getExternalStorageAppObbDirectory(
791 getPackageName());
792 }
793 return mObbDir;
794 }
795 }
796
797 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800798 public File getCacheDir() {
799 synchronized (mSync) {
800 if (mCacheDir == null) {
801 mCacheDir = new File(getDataDirFile(), "cache");
802 }
803 if (!mCacheDir.exists()) {
804 if(!mCacheDir.mkdirs()) {
Amith Yamasani92d57052012-08-23 10:07:52 -0700805 Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800806 return null;
807 }
808 FileUtils.setPermissions(
809 mCacheDir.getPath(),
810 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
811 -1, -1);
812 }
813 }
814 return mCacheDir;
815 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200816
Dianne Hackborne83cefce2010-02-04 17:38:14 -0800817 @Override
818 public File getExternalCacheDir() {
819 synchronized (mSync) {
820 if (mExternalCacheDir == null) {
821 mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
822 getPackageName());
823 }
824 if (!mExternalCacheDir.exists()) {
825 try {
826 (new File(Environment.getExternalStorageAndroidDataDir(),
827 ".nomedia")).createNewFile();
828 } catch (IOException e) {
829 }
830 if (!mExternalCacheDir.mkdirs()) {
831 Log.w(TAG, "Unable to create external cache directory");
832 return null;
833 }
834 }
835 return mExternalCacheDir;
836 }
837 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200838
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800839 @Override
840 public File getFileStreamPath(String name) {
841 return makeFilename(getFilesDir(), name);
842 }
843
844 @Override
845 public String[] fileList() {
846 final String[] list = getFilesDir().list();
847 return (list != null) ? list : EMPTY_FILE_LIST;
848 }
849
850 @Override
851 public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
Jeff Brown47847f32012-03-22 19:13:11 -0700852 return openOrCreateDatabase(name, mode, factory, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800853 }
854
855 @Override
Vasu Nori74f170f2010-06-01 18:06:18 -0700856 public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
857 DatabaseErrorHandler errorHandler) {
858 File f = validateFilePath(name, true);
Jeff Brown47847f32012-03-22 19:13:11 -0700859 int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
860 if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
861 flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
862 }
863 SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
Vasu Nori74f170f2010-06-01 18:06:18 -0700864 setFilePermissionsFromMode(f.getPath(), mode, 0);
865 return db;
866 }
867
868 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800869 public boolean deleteDatabase(String name) {
870 try {
Oscar Montemayora8529f62009-11-18 10:14:20 -0800871 File f = validateFilePath(name, false);
Jeff Brown79087e42012-03-01 19:52:44 -0800872 return SQLiteDatabase.deleteDatabase(f);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800873 } catch (Exception e) {
874 }
875 return false;
876 }
877
878 @Override
879 public File getDatabasePath(String name) {
Oscar Montemayora8529f62009-11-18 10:14:20 -0800880 return validateFilePath(name, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800881 }
882
883 @Override
884 public String[] databaseList() {
885 final String[] list = getDatabasesDir().list();
886 return (list != null) ? list : EMPTY_FILE_LIST;
887 }
888
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200889
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800890 private File getDatabasesDir() {
891 synchronized (mSync) {
892 if (mDatabasesDir == null) {
893 mDatabasesDir = new File(getDataDirFile(), "databases");
894 }
895 if (mDatabasesDir.getPath().equals("databases")) {
896 mDatabasesDir = new File("/data/system");
897 }
898 return mDatabasesDir;
899 }
900 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +0200901
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800902 @Override
903 public Drawable getWallpaper() {
Dianne Hackborn4c62fc02009-08-08 20:40:27 -0700904 return getWallpaperManager().getDrawable();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800905 }
906
907 @Override
Dianne Hackborn8cc6a502009-08-05 21:29:42 -0700908 public Drawable peekWallpaper() {
Dianne Hackborn4c62fc02009-08-08 20:40:27 -0700909 return getWallpaperManager().peekDrawable();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800910 }
911
912 @Override
913 public int getWallpaperDesiredMinimumWidth() {
Dianne Hackborn8cc6a502009-08-05 21:29:42 -0700914 return getWallpaperManager().getDesiredMinimumWidth();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800915 }
916
917 @Override
918 public int getWallpaperDesiredMinimumHeight() {
Dianne Hackborn8cc6a502009-08-05 21:29:42 -0700919 return getWallpaperManager().getDesiredMinimumHeight();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800920 }
921
922 @Override
923 public void setWallpaper(Bitmap bitmap) throws IOException {
Dianne Hackborn4c62fc02009-08-08 20:40:27 -0700924 getWallpaperManager().setBitmap(bitmap);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800925 }
926
927 @Override
928 public void setWallpaper(InputStream data) throws IOException {
Dianne Hackborn4c62fc02009-08-08 20:40:27 -0700929 getWallpaperManager().setStream(data);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800930 }
931
932 @Override
933 public void clearWallpaper() throws IOException {
Dianne Hackborn8cc6a502009-08-05 21:29:42 -0700934 getWallpaperManager().clear();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800935 }
936
937 @Override
938 public void startActivity(Intent intent) {
Amith Yamasanicd757062012-10-19 18:23:52 -0700939 warnIfCallingFromSystemProcess();
Dianne Hackborna4972e92012-03-14 10:38:05 -0700940 startActivity(intent, null);
941 }
942
Amith Yamasani82644082012-08-03 13:09:11 -0700943 /** @hide */
944 @Override
Dianne Hackborn79af1dd2012-08-16 16:42:52 -0700945 public void startActivityAsUser(Intent intent, UserHandle user) {
Dianne Hackbornf1c26e22012-08-23 13:54:58 -0700946 startActivityAsUser(intent, null, user);
Amith Yamasani82644082012-08-03 13:09:11 -0700947 }
948
Dianne Hackborna4972e92012-03-14 10:38:05 -0700949 @Override
950 public void startActivity(Intent intent, Bundle options) {
Amith Yamasanicd757062012-10-19 18:23:52 -0700951 warnIfCallingFromSystemProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800952 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
953 throw new AndroidRuntimeException(
954 "Calling startActivity() from outside of an Activity "
955 + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
956 + " Is this really what you want?");
957 }
958 mMainThread.getInstrumentation().execStartActivity(
Dianne Hackborn6e8304e2010-05-14 00:42:53 -0700959 getOuterContext(), mMainThread.getApplicationThread(), null,
Dianne Hackborna4972e92012-03-14 10:38:05 -0700960 (Activity)null, intent, -1, options);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800961 }
962
Amith Yamasani258848d2012-08-10 17:06:33 -0700963 /** @hide */
964 @Override
Dianne Hackborn79af1dd2012-08-16 16:42:52 -0700965 public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
Amith Yamasani258848d2012-08-10 17:06:33 -0700966 try {
967 ActivityManagerNative.getDefault().startActivityAsUser(
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800968 mMainThread.getApplicationThread(), getBasePackageName(), intent,
Amith Yamasani258848d2012-08-10 17:06:33 -0700969 intent.resolveTypeIfNeeded(getContentResolver()),
Dianne Hackborn79af1dd2012-08-16 16:42:52 -0700970 null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options,
971 user.getIdentifier());
Amith Yamasani258848d2012-08-10 17:06:33 -0700972 } catch (RemoteException re) {
973 }
974 }
975
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800976 @Override
Dianne Hackborn621e17d2010-11-22 15:59:56 -0800977 public void startActivities(Intent[] intents) {
Amith Yamasanicd757062012-10-19 18:23:52 -0700978 warnIfCallingFromSystemProcess();
Dianne Hackborna4972e92012-03-14 10:38:05 -0700979 startActivities(intents, null);
980 }
981
Amith Yamasaniea7e9152012-09-24 16:11:18 -0700982 /** @hide */
983 @Override
984 public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
985 if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
986 throw new AndroidRuntimeException(
987 "Calling startActivities() from outside of an Activity "
988 + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
989 + " Is this really what you want?");
990 }
991 mMainThread.getInstrumentation().execStartActivitiesAsUser(
992 getOuterContext(), mMainThread.getApplicationThread(), null,
993 (Activity)null, intents, options, userHandle.getIdentifier());
994 }
995
Dianne Hackborna4972e92012-03-14 10:38:05 -0700996 @Override
997 public void startActivities(Intent[] intents, Bundle options) {
Amith Yamasanicd757062012-10-19 18:23:52 -0700998 warnIfCallingFromSystemProcess();
Dianne Hackborn621e17d2010-11-22 15:59:56 -0800999 if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1000 throw new AndroidRuntimeException(
1001 "Calling startActivities() from outside of an Activity "
1002 + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
1003 + " Is this really what you want?");
1004 }
1005 mMainThread.getInstrumentation().execStartActivities(
1006 getOuterContext(), mMainThread.getApplicationThread(), null,
Dianne Hackborna4972e92012-03-14 10:38:05 -07001007 (Activity)null, intents, options);
Dianne Hackborn621e17d2010-11-22 15:59:56 -08001008 }
1009
1010 @Override
Dianne Hackbornfa82f222009-09-17 15:14:12 -07001011 public void startIntentSender(IntentSender intent,
1012 Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1013 throws IntentSender.SendIntentException {
Dianne Hackborna4972e92012-03-14 10:38:05 -07001014 startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
1015 }
1016
1017 @Override
1018 public void startIntentSender(IntentSender intent, Intent fillInIntent,
1019 int flagsMask, int flagsValues, int extraFlags, Bundle options)
1020 throws IntentSender.SendIntentException {
Dianne Hackbornfa82f222009-09-17 15:14:12 -07001021 try {
1022 String resolvedType = null;
1023 if (fillInIntent != null) {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001024 fillInIntent.migrateExtraStreamToClipData();
1025 fillInIntent.prepareToLeaveProcess();
Dianne Hackbornfa82f222009-09-17 15:14:12 -07001026 resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
1027 }
1028 int result = ActivityManagerNative.getDefault()
1029 .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
1030 fillInIntent, resolvedType, null, null,
Dianne Hackborna4972e92012-03-14 10:38:05 -07001031 0, flagsMask, flagsValues, options);
1032 if (result == ActivityManager.START_CANCELED) {
Dianne Hackbornfa82f222009-09-17 15:14:12 -07001033 throw new IntentSender.SendIntentException();
1034 }
1035 Instrumentation.checkStartActivityResult(result, null);
1036 } catch (RemoteException e) {
1037 }
1038 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +02001039
Dianne Hackbornfa82f222009-09-17 15:14:12 -07001040 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001041 public void sendBroadcast(Intent intent) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001042 warnIfCallingFromSystemProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001043 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1044 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001045 intent.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001046 ActivityManagerNative.getDefault().broadcastIntent(
1047 mMainThread.getApplicationThread(), intent, resolvedType, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001048 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false,
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001049 getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001050 } catch (RemoteException e) {
1051 }
1052 }
1053
Amith Yamasani67cf7d32012-02-16 14:31:23 -08001054 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001055 public void sendBroadcast(Intent intent, String receiverPermission) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001056 warnIfCallingFromSystemProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001057 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1058 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001059 intent.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001060 ActivityManagerNative.getDefault().broadcastIntent(
1061 mMainThread.getApplicationThread(), intent, resolvedType, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001062 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE,
1063 false, false, getUserId());
1064 } catch (RemoteException e) {
1065 }
1066 }
1067
1068 @Override
1069 public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1070 warnIfCallingFromSystemProcess();
1071 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1072 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001073 intent.prepareToLeaveProcess();
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001074 ActivityManagerNative.getDefault().broadcastIntent(
1075 mMainThread.getApplicationThread(), intent, resolvedType, null,
1076 Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001077 getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001078 } catch (RemoteException e) {
1079 }
1080 }
1081
1082 @Override
1083 public void sendOrderedBroadcast(Intent intent,
1084 String receiverPermission) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001085 warnIfCallingFromSystemProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001086 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1087 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001088 intent.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001089 ActivityManagerNative.getDefault().broadcastIntent(
1090 mMainThread.getApplicationThread(), intent, resolvedType, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001091 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false,
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001092 getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001093 } catch (RemoteException e) {
1094 }
1095 }
1096
1097 @Override
1098 public void sendOrderedBroadcast(Intent intent,
1099 String receiverPermission, BroadcastReceiver resultReceiver,
1100 Handler scheduler, int initialCode, String initialData,
1101 Bundle initialExtras) {
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001102 sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE,
1103 resultReceiver, scheduler, initialCode, initialData, initialExtras);
1104 }
1105
1106 @Override
1107 public void sendOrderedBroadcast(Intent intent,
1108 String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1109 Handler scheduler, int initialCode, String initialData,
1110 Bundle initialExtras) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001111 warnIfCallingFromSystemProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001112 IIntentReceiver rd = null;
1113 if (resultReceiver != null) {
1114 if (mPackageInfo != null) {
1115 if (scheduler == null) {
1116 scheduler = mMainThread.getHandler();
1117 }
1118 rd = mPackageInfo.getReceiverDispatcher(
1119 resultReceiver, getOuterContext(), scheduler,
1120 mMainThread.getInstrumentation(), false);
1121 } else {
1122 if (scheduler == null) {
1123 scheduler = mMainThread.getHandler();
1124 }
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001125 rd = new LoadedApk.ReceiverDispatcher(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001126 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1127 }
1128 }
1129 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1130 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001131 intent.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001132 ActivityManagerNative.getDefault().broadcastIntent(
1133 mMainThread.getApplicationThread(), intent, resolvedType, rd,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001134 initialCode, initialData, initialExtras, receiverPermission, appOp,
1135 true, false, getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001136 } catch (RemoteException e) {
1137 }
1138 }
1139
1140 @Override
Dianne Hackborn79af1dd2012-08-16 16:42:52 -07001141 public void sendBroadcastAsUser(Intent intent, UserHandle user) {
Dianne Hackborn7d19e022012-08-07 19:12:33 -07001142 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1143 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001144 intent.prepareToLeaveProcess();
Dianne Hackborn7d19e022012-08-07 19:12:33 -07001145 ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001146 intent, resolvedType, null, Activity.RESULT_OK, null, null, null,
1147 AppOpsManager.OP_NONE, false, false, user.getIdentifier());
Dianne Hackborn7d19e022012-08-07 19:12:33 -07001148 } catch (RemoteException e) {
1149 }
1150 }
1151
1152 @Override
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001153 public void sendBroadcastAsUser(Intent intent, UserHandle user,
1154 String receiverPermission) {
1155 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1156 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001157 intent.prepareToLeaveProcess();
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001158 ActivityManagerNative.getDefault().broadcastIntent(
1159 mMainThread.getApplicationThread(), intent, resolvedType, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001160 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false,
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001161 user.getIdentifier());
1162 } catch (RemoteException e) {
1163 }
1164 }
1165
1166 @Override
Dianne Hackborn79af1dd2012-08-16 16:42:52 -07001167 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001168 String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
Dianne Hackborn7d19e022012-08-07 19:12:33 -07001169 int initialCode, String initialData, Bundle initialExtras) {
1170 IIntentReceiver rd = null;
1171 if (resultReceiver != null) {
1172 if (mPackageInfo != null) {
1173 if (scheduler == null) {
1174 scheduler = mMainThread.getHandler();
1175 }
1176 rd = mPackageInfo.getReceiverDispatcher(
1177 resultReceiver, getOuterContext(), scheduler,
1178 mMainThread.getInstrumentation(), false);
1179 } else {
1180 if (scheduler == null) {
1181 scheduler = mMainThread.getHandler();
1182 }
1183 rd = new LoadedApk.ReceiverDispatcher(
1184 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1185 }
1186 }
1187 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1188 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001189 intent.prepareToLeaveProcess();
Dianne Hackborn7d19e022012-08-07 19:12:33 -07001190 ActivityManagerNative.getDefault().broadcastIntent(
1191 mMainThread.getApplicationThread(), intent, resolvedType, rd,
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001192 initialCode, initialData, initialExtras, receiverPermission,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001193 AppOpsManager.OP_NONE, true, false, user.getIdentifier());
Dianne Hackborn7d19e022012-08-07 19:12:33 -07001194 } catch (RemoteException e) {
1195 }
1196 }
1197
1198 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001199 public void sendStickyBroadcast(Intent intent) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001200 warnIfCallingFromSystemProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001201 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1202 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001203 intent.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001204 ActivityManagerNative.getDefault().broadcastIntent(
1205 mMainThread.getApplicationThread(), intent, resolvedType, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001206 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true,
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001207 getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001208 } catch (RemoteException e) {
1209 }
1210 }
1211
1212 @Override
Dianne Hackbornefa199f2009-09-19 12:03:15 -07001213 public void sendStickyOrderedBroadcast(Intent intent,
1214 BroadcastReceiver resultReceiver,
1215 Handler scheduler, int initialCode, String initialData,
1216 Bundle initialExtras) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001217 warnIfCallingFromSystemProcess();
Dianne Hackbornefa199f2009-09-19 12:03:15 -07001218 IIntentReceiver rd = null;
1219 if (resultReceiver != null) {
1220 if (mPackageInfo != null) {
1221 if (scheduler == null) {
1222 scheduler = mMainThread.getHandler();
1223 }
1224 rd = mPackageInfo.getReceiverDispatcher(
1225 resultReceiver, getOuterContext(), scheduler,
1226 mMainThread.getInstrumentation(), false);
1227 } else {
1228 if (scheduler == null) {
1229 scheduler = mMainThread.getHandler();
1230 }
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001231 rd = new LoadedApk.ReceiverDispatcher(
Dianne Hackbornefa199f2009-09-19 12:03:15 -07001232 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1233 }
1234 }
1235 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1236 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001237 intent.prepareToLeaveProcess();
Dianne Hackbornefa199f2009-09-19 12:03:15 -07001238 ActivityManagerNative.getDefault().broadcastIntent(
1239 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1240 initialCode, initialData, initialExtras, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001241 AppOpsManager.OP_NONE, true, true, getUserId());
Dianne Hackbornefa199f2009-09-19 12:03:15 -07001242 } catch (RemoteException e) {
1243 }
1244 }
1245
1246 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001247 public void removeStickyBroadcast(Intent intent) {
1248 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1249 if (resolvedType != null) {
1250 intent = new Intent(intent);
1251 intent.setDataAndType(intent.getData(), resolvedType);
1252 }
1253 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001254 intent.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001255 ActivityManagerNative.getDefault().unbroadcastIntent(
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001256 mMainThread.getApplicationThread(), intent, getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001257 } catch (RemoteException e) {
1258 }
1259 }
1260
1261 @Override
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001262 public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1263 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1264 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001265 intent.prepareToLeaveProcess();
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001266 ActivityManagerNative.getDefault().broadcastIntent(
1267 mMainThread.getApplicationThread(), intent, resolvedType, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001268 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier());
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001269 } catch (RemoteException e) {
1270 }
1271 }
1272
1273 @Override
1274 public void sendStickyOrderedBroadcastAsUser(Intent intent,
1275 UserHandle user, BroadcastReceiver resultReceiver,
1276 Handler scheduler, int initialCode, String initialData,
1277 Bundle initialExtras) {
1278 IIntentReceiver rd = null;
1279 if (resultReceiver != null) {
1280 if (mPackageInfo != null) {
1281 if (scheduler == null) {
1282 scheduler = mMainThread.getHandler();
1283 }
1284 rd = mPackageInfo.getReceiverDispatcher(
1285 resultReceiver, getOuterContext(), scheduler,
1286 mMainThread.getInstrumentation(), false);
1287 } else {
1288 if (scheduler == null) {
1289 scheduler = mMainThread.getHandler();
1290 }
1291 rd = new LoadedApk.ReceiverDispatcher(
1292 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1293 }
1294 }
1295 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1296 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001297 intent.prepareToLeaveProcess();
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001298 ActivityManagerNative.getDefault().broadcastIntent(
1299 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1300 initialCode, initialData, initialExtras, null,
Dianne Hackbornf51f6122013-02-04 18:23:34 -08001301 AppOpsManager.OP_NONE, true, true, user.getIdentifier());
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001302 } catch (RemoteException e) {
1303 }
1304 }
1305
1306 @Override
1307 public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
1308 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1309 if (resolvedType != null) {
1310 intent = new Intent(intent);
1311 intent.setDataAndType(intent.getData(), resolvedType);
1312 }
1313 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001314 intent.prepareToLeaveProcess();
Dianne Hackborn5ac72a22012-08-29 18:32:08 -07001315 ActivityManagerNative.getDefault().unbroadcastIntent(
1316 mMainThread.getApplicationThread(), intent, user.getIdentifier());
1317 } catch (RemoteException e) {
1318 }
1319 }
1320
1321 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001322 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1323 return registerReceiver(receiver, filter, null, null);
1324 }
1325
1326 @Override
1327 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1328 String broadcastPermission, Handler scheduler) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001329 return registerReceiverInternal(receiver, getUserId(),
Dianne Hackborn20e80982012-08-31 19:00:44 -07001330 filter, broadcastPermission, scheduler, getOuterContext());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001331 }
1332
Dianne Hackborn20e80982012-08-31 19:00:44 -07001333 @Override
1334 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
1335 IntentFilter filter, String broadcastPermission, Handler scheduler) {
1336 return registerReceiverInternal(receiver, user.getIdentifier(),
1337 filter, broadcastPermission, scheduler, getOuterContext());
1338 }
1339
1340 private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001341 IntentFilter filter, String broadcastPermission,
1342 Handler scheduler, Context context) {
1343 IIntentReceiver rd = null;
1344 if (receiver != null) {
1345 if (mPackageInfo != null && context != null) {
1346 if (scheduler == null) {
1347 scheduler = mMainThread.getHandler();
1348 }
1349 rd = mPackageInfo.getReceiverDispatcher(
1350 receiver, context, scheduler,
1351 mMainThread.getInstrumentation(), true);
1352 } else {
1353 if (scheduler == null) {
1354 scheduler = mMainThread.getHandler();
1355 }
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001356 rd = new LoadedApk.ReceiverDispatcher(
Dianne Hackborn399cccb2010-04-13 22:57:49 -07001357 receiver, context, scheduler, null, true).getIIntentReceiver();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001358 }
1359 }
1360 try {
1361 return ActivityManagerNative.getDefault().registerReceiver(
Dianne Hackborn6c418d52011-06-29 14:05:33 -07001362 mMainThread.getApplicationThread(), mBasePackageName,
Dianne Hackborn20e80982012-08-31 19:00:44 -07001363 rd, filter, broadcastPermission, userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001364 } catch (RemoteException e) {
1365 return null;
1366 }
1367 }
1368
1369 @Override
1370 public void unregisterReceiver(BroadcastReceiver receiver) {
1371 if (mPackageInfo != null) {
1372 IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
1373 getOuterContext(), receiver);
1374 try {
1375 ActivityManagerNative.getDefault().unregisterReceiver(rd);
1376 } catch (RemoteException e) {
1377 }
1378 } else {
1379 throw new RuntimeException("Not supported in system context");
1380 }
1381 }
1382
1383 @Override
1384 public ComponentName startService(Intent service) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001385 warnIfCallingFromSystemProcess();
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001386 return startServiceAsUser(service, mUser);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001387 }
1388
1389 @Override
1390 public boolean stopService(Intent service) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001391 warnIfCallingFromSystemProcess();
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001392 return stopServiceAsUser(service, mUser);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001393 }
1394
1395 @Override
1396 public ComponentName startServiceAsUser(Intent service, UserHandle user) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001397 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001398 service.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001399 ComponentName cn = ActivityManagerNative.getDefault().startService(
1400 mMainThread.getApplicationThread(), service,
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001401 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
Dianne Hackbornc0bd7472012-10-09 14:00:30 -07001402 if (cn != null) {
1403 if (cn.getPackageName().equals("!")) {
1404 throw new SecurityException(
1405 "Not allowed to start service " + service
1406 + " without permission " + cn.getClassName());
1407 } else if (cn.getPackageName().equals("!!")) {
1408 throw new SecurityException(
1409 "Unable to start service " + service
1410 + ": " + cn.getClassName());
1411 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001412 }
1413 return cn;
1414 } catch (RemoteException e) {
1415 return null;
1416 }
1417 }
1418
1419 @Override
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001420 public boolean stopServiceAsUser(Intent service, UserHandle user) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001421 try {
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001422 service.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001423 int res = ActivityManagerNative.getDefault().stopService(
1424 mMainThread.getApplicationThread(), service,
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001425 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001426 if (res < 0) {
1427 throw new SecurityException(
1428 "Not allowed to stop service " + service);
1429 }
1430 return res != 0;
1431 } catch (RemoteException e) {
1432 return false;
1433 }
1434 }
1435
1436 @Override
1437 public boolean bindService(Intent service, ServiceConnection conn,
1438 int flags) {
Amith Yamasanicd757062012-10-19 18:23:52 -07001439 warnIfCallingFromSystemProcess();
Amith Yamasani27b89e62013-01-16 12:30:11 -08001440 return bindServiceAsUser(service, conn, flags, Process.myUserHandle());
Amith Yamasani37ce3a82012-02-06 12:04:42 -08001441 }
1442
1443 /** @hide */
1444 @Override
Amith Yamasani27b89e62013-01-16 12:30:11 -08001445 public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
1446 UserHandle user) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001447 IServiceConnection sd;
Christopher Tate79b33172012-06-18 14:54:21 -07001448 if (conn == null) {
1449 throw new IllegalArgumentException("connection is null");
1450 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001451 if (mPackageInfo != null) {
1452 sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
1453 mMainThread.getHandler(), flags);
1454 } else {
1455 throw new RuntimeException("Not supported in system context");
1456 }
1457 try {
Dianne Hackbornc68c9132011-07-29 01:25:18 -07001458 IBinder token = getActivityToken();
1459 if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1460 && mPackageInfo.getApplicationInfo().targetSdkVersion
1461 < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1462 flags |= BIND_WAIVE_PRIORITY;
1463 }
Jeff Sharkeya14acd22013-04-02 18:27:45 -07001464 service.prepareToLeaveProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001465 int res = ActivityManagerNative.getDefault().bindService(
1466 mMainThread.getApplicationThread(), getActivityToken(),
1467 service, service.resolveTypeIfNeeded(getContentResolver()),
Amith Yamasani27b89e62013-01-16 12:30:11 -08001468 sd, flags, user.getIdentifier());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001469 if (res < 0) {
1470 throw new SecurityException(
1471 "Not allowed to bind to service " + service);
1472 }
1473 return res != 0;
1474 } catch (RemoteException e) {
1475 return false;
1476 }
1477 }
1478
1479 @Override
1480 public void unbindService(ServiceConnection conn) {
Christopher Tate79b33172012-06-18 14:54:21 -07001481 if (conn == null) {
1482 throw new IllegalArgumentException("connection is null");
1483 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001484 if (mPackageInfo != null) {
1485 IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
1486 getOuterContext(), conn);
1487 try {
1488 ActivityManagerNative.getDefault().unbindService(sd);
1489 } catch (RemoteException e) {
1490 }
1491 } else {
1492 throw new RuntimeException("Not supported in system context");
1493 }
1494 }
1495
1496 @Override
1497 public boolean startInstrumentation(ComponentName className,
1498 String profileFile, Bundle arguments) {
1499 try {
Dianne Hackborn9ecebbf2011-09-28 23:19:47 -04001500 if (arguments != null) {
1501 arguments.setAllowFds(false);
1502 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001503 return ActivityManagerNative.getDefault().startInstrumentation(
Svetoslav Ganov80943d82013-01-02 10:25:37 -08001504 className, profileFile, 0, arguments, null, null, getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001505 } catch (RemoteException e) {
1506 // System has crashed, nothing we can do.
1507 }
1508 return false;
1509 }
1510
1511 @Override
1512 public Object getSystemService(String name) {
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -08001513 ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1514 return fetcher == null ? null : fetcher.getService(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001515 }
1516
Dianne Hackborn8cc6a502009-08-05 21:29:42 -07001517 private WallpaperManager getWallpaperManager() {
Brad Fitzpatrick224ba0c2010-11-12 12:22:15 -08001518 return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001519 }
1520
Brad Fitzpatrick438d0592010-06-10 12:19:19 -07001521 /* package */ static DropBoxManager createDropBoxManager() {
1522 IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1523 IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
Brad Fitzpatrickec062f62010-11-03 09:56:54 -07001524 if (service == null) {
1525 // Don't return a DropBoxManager that will NPE upon use.
1526 // This also avoids caching a broken DropBoxManager in
1527 // getDropBoxManager during early boot, before the
1528 // DROPBOX_SERVICE is registered.
1529 return null;
1530 }
Brad Fitzpatrick438d0592010-06-10 12:19:19 -07001531 return new DropBoxManager(service);
1532 }
1533
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001534 @Override
1535 public int checkPermission(String permission, int pid, int uid) {
1536 if (permission == null) {
1537 throw new IllegalArgumentException("permission is null");
1538 }
1539
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001540 try {
1541 return ActivityManagerNative.getDefault().checkPermission(
1542 permission, pid, uid);
1543 } catch (RemoteException e) {
1544 return PackageManager.PERMISSION_DENIED;
1545 }
1546 }
1547
1548 @Override
1549 public int checkCallingPermission(String permission) {
1550 if (permission == null) {
1551 throw new IllegalArgumentException("permission is null");
1552 }
1553
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001554 int pid = Binder.getCallingPid();
1555 if (pid != Process.myPid()) {
Amith Yamasani742a6712011-05-04 14:49:28 -07001556 return checkPermission(permission, pid, Binder.getCallingUid());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001557 }
1558 return PackageManager.PERMISSION_DENIED;
1559 }
1560
1561 @Override
1562 public int checkCallingOrSelfPermission(String permission) {
1563 if (permission == null) {
1564 throw new IllegalArgumentException("permission is null");
1565 }
1566
1567 return checkPermission(permission, Binder.getCallingPid(),
1568 Binder.getCallingUid());
1569 }
1570
1571 private void enforce(
1572 String permission, int resultOfCheck,
1573 boolean selfToo, int uid, String message) {
1574 if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1575 throw new SecurityException(
1576 (message != null ? (message + ": ") : "") +
1577 (selfToo
1578 ? "Neither user " + uid + " nor current process has "
Christopher Tate4dc7a682012-09-11 12:15:49 -07001579 : "uid " + uid + " does not have ") +
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001580 permission +
1581 ".");
1582 }
1583 }
1584
1585 public void enforcePermission(
1586 String permission, int pid, int uid, String message) {
1587 enforce(permission,
1588 checkPermission(permission, pid, uid),
1589 false,
1590 uid,
1591 message);
1592 }
1593
1594 public void enforceCallingPermission(String permission, String message) {
1595 enforce(permission,
1596 checkCallingPermission(permission),
1597 false,
1598 Binder.getCallingUid(),
1599 message);
1600 }
1601
1602 public void enforceCallingOrSelfPermission(
1603 String permission, String message) {
1604 enforce(permission,
1605 checkCallingOrSelfPermission(permission),
1606 true,
1607 Binder.getCallingUid(),
1608 message);
1609 }
1610
1611 @Override
1612 public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
1613 try {
1614 ActivityManagerNative.getDefault().grantUriPermission(
1615 mMainThread.getApplicationThread(), toPackage, uri,
1616 modeFlags);
1617 } catch (RemoteException e) {
1618 }
1619 }
1620
1621 @Override
1622 public void revokeUriPermission(Uri uri, int modeFlags) {
1623 try {
1624 ActivityManagerNative.getDefault().revokeUriPermission(
1625 mMainThread.getApplicationThread(), uri,
1626 modeFlags);
1627 } catch (RemoteException e) {
1628 }
1629 }
1630
1631 @Override
1632 public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001633 try {
1634 return ActivityManagerNative.getDefault().checkUriPermission(
1635 uri, pid, uid, modeFlags);
1636 } catch (RemoteException e) {
1637 return PackageManager.PERMISSION_DENIED;
1638 }
1639 }
1640
1641 @Override
1642 public int checkCallingUriPermission(Uri uri, int modeFlags) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001643 int pid = Binder.getCallingPid();
1644 if (pid != Process.myPid()) {
1645 return checkUriPermission(uri, pid,
1646 Binder.getCallingUid(), modeFlags);
1647 }
1648 return PackageManager.PERMISSION_DENIED;
1649 }
1650
1651 @Override
1652 public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
1653 return checkUriPermission(uri, Binder.getCallingPid(),
1654 Binder.getCallingUid(), modeFlags);
1655 }
1656
1657 @Override
1658 public int checkUriPermission(Uri uri, String readPermission,
1659 String writePermission, int pid, int uid, int modeFlags) {
Mitsuru Oshima569076c2009-07-02 20:06:08 -07001660 if (DEBUG) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001661 Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
1662 + readPermission + " writePermission=" + writePermission
1663 + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
1664 }
1665 if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
1666 if (readPermission == null
1667 || checkPermission(readPermission, pid, uid)
1668 == PackageManager.PERMISSION_GRANTED) {
1669 return PackageManager.PERMISSION_GRANTED;
1670 }
1671 }
1672 if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
1673 if (writePermission == null
1674 || checkPermission(writePermission, pid, uid)
1675 == PackageManager.PERMISSION_GRANTED) {
1676 return PackageManager.PERMISSION_GRANTED;
1677 }
1678 }
1679 return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
1680 : PackageManager.PERMISSION_DENIED;
1681 }
1682
1683 private String uriModeFlagToString(int uriModeFlags) {
1684 switch (uriModeFlags) {
1685 case Intent.FLAG_GRANT_READ_URI_PERMISSION |
1686 Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
1687 return "read and write";
1688 case Intent.FLAG_GRANT_READ_URI_PERMISSION:
1689 return "read";
1690 case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
1691 return "write";
1692 }
1693 throw new IllegalArgumentException(
1694 "Unknown permission mode flags: " + uriModeFlags);
1695 }
1696
1697 private void enforceForUri(
1698 int modeFlags, int resultOfCheck, boolean selfToo,
1699 int uid, Uri uri, String message) {
1700 if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1701 throw new SecurityException(
1702 (message != null ? (message + ": ") : "") +
1703 (selfToo
1704 ? "Neither user " + uid + " nor current process has "
1705 : "User " + uid + " does not have ") +
1706 uriModeFlagToString(modeFlags) +
1707 " permission on " +
1708 uri +
1709 ".");
1710 }
1711 }
1712
1713 public void enforceUriPermission(
1714 Uri uri, int pid, int uid, int modeFlags, String message) {
1715 enforceForUri(
1716 modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
1717 false, uid, uri, message);
1718 }
1719
1720 public void enforceCallingUriPermission(
1721 Uri uri, int modeFlags, String message) {
1722 enforceForUri(
1723 modeFlags, checkCallingUriPermission(uri, modeFlags),
Amith Yamasani742a6712011-05-04 14:49:28 -07001724 false,
1725 Binder.getCallingUid(), uri, message);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001726 }
1727
1728 public void enforceCallingOrSelfUriPermission(
1729 Uri uri, int modeFlags, String message) {
1730 enforceForUri(
1731 modeFlags,
1732 checkCallingOrSelfUriPermission(uri, modeFlags), true,
1733 Binder.getCallingUid(), uri, message);
1734 }
1735
1736 public void enforceUriPermission(
1737 Uri uri, String readPermission, String writePermission,
1738 int pid, int uid, int modeFlags, String message) {
1739 enforceForUri(modeFlags,
1740 checkUriPermission(
1741 uri, readPermission, writePermission, pid, uid,
1742 modeFlags),
1743 false,
1744 uid,
1745 uri,
1746 message);
1747 }
1748
Amith Yamasanicd757062012-10-19 18:23:52 -07001749 private void warnIfCallingFromSystemProcess() {
1750 if (Process.myUid() == Process.SYSTEM_UID) {
1751 Slog.w(TAG, "Calling a method in the system process without a qualified user: "
Dianne Hackborn40e9f292012-11-27 19:12:23 -08001752 + Debug.getCallers(5));
Amith Yamasanicd757062012-10-19 18:23:52 -07001753 }
1754 }
1755
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001756 @Override
1757 public Context createPackageContext(String packageName, int flags)
Jeff Sharkey6d515712012-09-20 16:06:08 -07001758 throws NameNotFoundException {
Amith Yamasani64442c12012-10-07 08:17:46 -07001759 return createPackageContextAsUser(packageName, flags,
1760 mUser != null ? mUser : Process.myUserHandle());
Jeff Sharkey6d515712012-09-20 16:06:08 -07001761 }
1762
1763 @Override
1764 public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
1765 throws NameNotFoundException {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001766 if (packageName.equals("system") || packageName.equals("android")) {
Jeff Sharkey816e4f72012-04-22 17:08:52 -07001767 final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
Adam Powell6f2a3d22012-10-05 22:32:04 -07001768 context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1769 context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user);
Jeff Sharkey816e4f72012-04-22 17:08:52 -07001770 return context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001771 }
1772
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001773 LoadedApk pi =
Amith Yamasani98edc952012-09-25 14:09:27 -07001774 mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags,
1775 user.getIdentifier());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001776 if (pi != null) {
Dianne Hackborn21556372010-02-04 16:34:40 -08001777 ContextImpl c = new ContextImpl();
Romain Guy870e09f2009-07-06 16:35:25 -07001778 c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
Jeff Sharkey6d515712012-09-20 16:06:08 -07001779 c.init(pi, null, mMainThread, mResources, mBasePackageName, user);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001780 if (c.mResources != null) {
1781 return c;
1782 }
1783 }
1784
1785 // Should be a better exception.
1786 throw new PackageManager.NameNotFoundException(
1787 "Application package " + packageName + " not found");
1788 }
1789
Romain Guy870e09f2009-07-06 16:35:25 -07001790 @Override
Dianne Hackborn756220b2012-08-14 16:45:30 -07001791 public Context createConfigurationContext(Configuration overrideConfiguration) {
Jeff Browna492c3a2012-08-23 19:48:44 -07001792 if (overrideConfiguration == null) {
1793 throw new IllegalArgumentException("overrideConfiguration must not be null");
1794 }
1795
Dianne Hackborn756220b2012-08-14 16:45:30 -07001796 ContextImpl c = new ContextImpl();
1797 c.init(mPackageInfo, null, mMainThread);
1798 c.mResources = mMainThread.getTopLevelResources(
Jeff Browna492c3a2012-08-23 19:48:44 -07001799 mPackageInfo.getResDir(),
1800 getDisplayId(), overrideConfiguration,
Dianne Hackborn756220b2012-08-14 16:45:30 -07001801 mResources.getCompatibilityInfo());
1802 return c;
1803 }
1804
1805 @Override
Jeff Browna492c3a2012-08-23 19:48:44 -07001806 public Context createDisplayContext(Display display) {
1807 if (display == null) {
1808 throw new IllegalArgumentException("display must not be null");
1809 }
1810
1811 int displayId = display.getDisplayId();
1812 CompatibilityInfo ci = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
1813 CompatibilityInfoHolder cih = getCompatibilityInfo(displayId);
1814 if (cih != null) {
1815 ci = cih.get();
1816 }
1817
1818 ContextImpl context = new ContextImpl();
1819 context.init(mPackageInfo, null, mMainThread);
1820 context.mDisplay = display;
1821 context.mResources = mMainThread.getTopLevelResources(
1822 mPackageInfo.getResDir(), displayId, null, ci);
1823 return context;
1824 }
1825
1826 private int getDisplayId() {
1827 return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
1828 }
1829
1830 @Override
Romain Guy870e09f2009-07-06 16:35:25 -07001831 public boolean isRestricted() {
1832 return mRestricted;
1833 }
1834
Jeff Brown98365d72012-08-19 20:30:52 -07001835 @Override
Jeff Browna492c3a2012-08-23 19:48:44 -07001836 public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
1837 return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
Jeff Brown98365d72012-08-19 20:30:52 -07001838 }
1839
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001840 private File getDataDirFile() {
1841 if (mPackageInfo != null) {
1842 return mPackageInfo.getDataDirFile();
1843 }
1844 throw new RuntimeException("Not supported in system context");
1845 }
1846
1847 @Override
1848 public File getDir(String name, int mode) {
1849 name = "app_" + name;
1850 File file = makeFilename(getDataDirFile(), name);
1851 if (!file.exists()) {
1852 file.mkdir();
1853 setFilePermissionsFromMode(file.getPath(), mode,
1854 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
1855 }
1856 return file;
1857 }
1858
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001859 /** {@hide} */
1860 public int getUserId() {
1861 return mUser.getIdentifier();
1862 }
1863
Dianne Hackborn21556372010-02-04 16:34:40 -08001864 static ContextImpl createSystemContext(ActivityThread mainThread) {
Jeff Sharkey6d515712012-09-20 16:06:08 -07001865 final ContextImpl context = new ContextImpl();
1866 context.init(Resources.getSystem(), mainThread, Process.myUserHandle());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001867 return context;
1868 }
1869
Dianne Hackborn21556372010-02-04 16:34:40 -08001870 ContextImpl() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001871 mOuterContext = this;
1872 }
1873
1874 /**
1875 * Create a new ApplicationContext from an existing one. The new one
1876 * works and operates the same as the one it is copying.
1877 *
1878 * @param context Existing application context.
1879 */
Dianne Hackborn21556372010-02-04 16:34:40 -08001880 public ContextImpl(ContextImpl context) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001881 mPackageInfo = context.mPackageInfo;
Dianne Hackborn6c418d52011-06-29 14:05:33 -07001882 mBasePackageName = context.mBasePackageName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001883 mResources = context.mResources;
1884 mMainThread = context.mMainThread;
1885 mContentResolver = context.mContentResolver;
Jeff Sharkey6d515712012-09-20 16:06:08 -07001886 mUser = context.mUser;
Jeff Browna492c3a2012-08-23 19:48:44 -07001887 mDisplay = context.mDisplay;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001888 mOuterContext = this;
1889 }
1890
Jeff Sharkey6d515712012-09-20 16:06:08 -07001891 final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
1892 init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
Mitsuru Oshimaba3ba572009-07-08 18:49:26 -07001893 }
1894
Jeff Sharkey6d515712012-09-20 16:06:08 -07001895 final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
1896 Resources container, String basePackageName, UserHandle user) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001897 mPackageInfo = packageInfo;
Dianne Hackborn6c418d52011-06-29 14:05:33 -07001898 mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001899 mResources = mPackageInfo.getResources(mainThread);
Mitsuru Oshimaba3ba572009-07-08 18:49:26 -07001900
Dianne Hackborn559a7872010-04-07 18:19:41 -07001901 if (mResources != null && container != null
1902 && container.getCompatibilityInfo().applicationScale !=
1903 mResources.getCompatibilityInfo().applicationScale) {
Mitsuru Oshimaba3ba572009-07-08 18:49:26 -07001904 if (DEBUG) {
1905 Log.d(TAG, "loaded context has different scaling. Using container's" +
1906 " compatiblity info:" + container.getDisplayMetrics());
1907 }
1908 mResources = mainThread.getTopLevelResources(
Jeff Browna492c3a2012-08-23 19:48:44 -07001909 mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
1910 null, container.getCompatibilityInfo());
Mitsuru Oshimaba3ba572009-07-08 18:49:26 -07001911 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001912 mMainThread = mainThread;
Dianne Hackborn756220b2012-08-14 16:45:30 -07001913 mActivityToken = activityToken;
Jeff Sharkey6d515712012-09-20 16:06:08 -07001914 mContentResolver = new ApplicationContentResolver(this, mainThread, user);
1915 mUser = user;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001916 }
1917
Jeff Sharkey6d515712012-09-20 16:06:08 -07001918 final void init(Resources resources, ActivityThread mainThread, UserHandle user) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001919 mPackageInfo = null;
Dianne Hackborn6c418d52011-06-29 14:05:33 -07001920 mBasePackageName = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001921 mResources = resources;
1922 mMainThread = mainThread;
Jeff Sharkey6d515712012-09-20 16:06:08 -07001923 mContentResolver = new ApplicationContentResolver(this, mainThread, user);
1924 mUser = user;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001925 }
1926
1927 final void scheduleFinalCleanup(String who, String what) {
1928 mMainThread.scheduleContextCleanup(this, who, what);
1929 }
1930
1931 final void performFinalCleanup(String who, String what) {
1932 //Log.i(TAG, "Cleanup up context: " + this);
1933 mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
1934 }
1935
1936 final Context getReceiverRestrictedContext() {
1937 if (mReceiverRestrictedContext != null) {
1938 return mReceiverRestrictedContext;
1939 }
1940 return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
1941 }
1942
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001943 final void setOuterContext(Context context) {
1944 mOuterContext = context;
1945 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +02001946
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001947 final Context getOuterContext() {
1948 return mOuterContext;
1949 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +02001950
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001951 final IBinder getActivityToken() {
1952 return mActivityToken;
1953 }
1954
Brad Fitzpatrickd3da4402010-11-10 08:27:11 -08001955 static void setFilePermissionsFromMode(String name, int mode,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001956 int extraPermissions) {
1957 int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
1958 |FileUtils.S_IRGRP|FileUtils.S_IWGRP
1959 |extraPermissions;
1960 if ((mode&MODE_WORLD_READABLE) != 0) {
1961 perms |= FileUtils.S_IROTH;
1962 }
1963 if ((mode&MODE_WORLD_WRITEABLE) != 0) {
1964 perms |= FileUtils.S_IWOTH;
1965 }
Mitsuru Oshima569076c2009-07-02 20:06:08 -07001966 if (DEBUG) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001967 Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
1968 + ", perms=0x" + Integer.toHexString(perms));
1969 }
1970 FileUtils.setPermissions(name, perms, -1, -1);
1971 }
1972
Oscar Montemayora8529f62009-11-18 10:14:20 -08001973 private File validateFilePath(String name, boolean createDirectory) {
1974 File dir;
1975 File f;
1976
1977 if (name.charAt(0) == File.separatorChar) {
1978 String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1979 dir = new File(dirPath);
1980 name = name.substring(name.lastIndexOf(File.separatorChar));
1981 f = new File(dir, name);
1982 } else {
1983 dir = getDatabasesDir();
1984 f = makeFilename(dir, name);
1985 }
1986
1987 if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1988 FileUtils.setPermissions(dir.getPath(),
1989 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1990 -1, -1);
1991 }
1992
1993 return f;
1994 }
1995
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001996 private File makeFilename(File base, String name) {
1997 if (name.indexOf(File.separatorChar) < 0) {
1998 return new File(base, name);
1999 }
2000 throw new IllegalArgumentException(
Oscar Montemayora8529f62009-11-18 10:14:20 -08002001 "File " + name + " contains a path separator");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002002 }
2003
2004 // ----------------------------------------------------------------------
2005 // ----------------------------------------------------------------------
2006 // ----------------------------------------------------------------------
2007
2008 private static final class ApplicationContentResolver extends ContentResolver {
Jeff Sharkey6d515712012-09-20 16:06:08 -07002009 private final ActivityThread mMainThread;
2010 private final UserHandle mUser;
2011
2012 public ApplicationContentResolver(
2013 Context context, ActivityThread mainThread, UserHandle user) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002014 super(context);
Jeff Sharkey6d515712012-09-20 16:06:08 -07002015 mMainThread = Preconditions.checkNotNull(mainThread);
2016 mUser = Preconditions.checkNotNull(user);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002017 }
2018
2019 @Override
Jeff Sharkey6d515712012-09-20 16:06:08 -07002020 protected IContentProvider acquireProvider(Context context, String auth) {
2021 return mMainThread.acquireProvider(context, auth, mUser.getIdentifier(), true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002022 }
2023
2024 @Override
Jeff Sharkey6d515712012-09-20 16:06:08 -07002025 protected IContentProvider acquireExistingProvider(Context context, String auth) {
2026 return mMainThread.acquireExistingProvider(context, auth, mUser.getIdentifier(), true);
Dianne Hackborncca1f0e2010-09-26 18:34:53 -07002027 }
2028
2029 @Override
2030 public boolean releaseProvider(IContentProvider provider) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07002031 return mMainThread.releaseProvider(provider, true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002032 }
Christian Mehlmauer5f5acca2010-06-25 19:06:18 +02002033
Dianne Hackborn652b6d12012-05-09 18:18:40 -07002034 @Override
Jeff Sharkey6d515712012-09-20 16:06:08 -07002035 protected IContentProvider acquireUnstableProvider(Context c, String auth) {
2036 return mMainThread.acquireProvider(c, auth, mUser.getIdentifier(), false);
Dianne Hackborn652b6d12012-05-09 18:18:40 -07002037 }
2038
2039 @Override
2040 public boolean releaseUnstableProvider(IContentProvider icp) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07002041 return mMainThread.releaseProvider(icp, false);
2042 }
2043
2044 @Override
2045 public void unstableProviderDied(IContentProvider icp) {
2046 mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
Dianne Hackborn652b6d12012-05-09 18:18:40 -07002047 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002048 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002049}