• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package android.app;
18 
19 import com.android.internal.policy.PolicyManager;
20 import com.android.internal.util.Preconditions;
21 
22 import android.bluetooth.BluetoothManager;
23 import android.content.BroadcastReceiver;
24 import android.content.ComponentName;
25 import android.content.ContentResolver;
26 import android.content.Context;
27 import android.content.ContextWrapper;
28 import android.content.IContentProvider;
29 import android.content.Intent;
30 import android.content.IntentFilter;
31 import android.content.IIntentReceiver;
32 import android.content.IntentSender;
33 import android.content.ReceiverCallNotAllowedException;
34 import android.content.ServiceConnection;
35 import android.content.SharedPreferences;
36 import android.content.pm.ApplicationInfo;
37 import android.content.pm.IPackageManager;
38 import android.content.pm.PackageManager;
39 import android.content.pm.PackageManager.NameNotFoundException;
40 import android.content.res.AssetManager;
41 import android.content.res.CompatibilityInfo;
42 import android.content.res.Configuration;
43 import android.content.res.Resources;
44 import android.database.DatabaseErrorHandler;
45 import android.database.sqlite.SQLiteDatabase;
46 import android.database.sqlite.SQLiteDatabase.CursorFactory;
47 import android.graphics.Bitmap;
48 import android.graphics.drawable.Drawable;
49 import android.hardware.ISerialManager;
50 import android.hardware.SerialManager;
51 import android.hardware.SystemSensorManager;
52 import android.hardware.display.DisplayManager;
53 import android.hardware.input.InputManager;
54 import android.hardware.usb.IUsbManager;
55 import android.hardware.usb.UsbManager;
56 import android.location.CountryDetector;
57 import android.location.ICountryDetector;
58 import android.location.ILocationManager;
59 import android.location.LocationManager;
60 import android.media.AudioManager;
61 import android.media.MediaRouter;
62 import android.net.ConnectivityManager;
63 import android.net.IConnectivityManager;
64 import android.net.INetworkPolicyManager;
65 import android.net.NetworkPolicyManager;
66 import android.net.Uri;
67 import android.net.nsd.INsdManager;
68 import android.net.nsd.NsdManager;
69 import android.net.wifi.IWifiManager;
70 import android.net.wifi.WifiManager;
71 import android.net.wifi.p2p.IWifiP2pManager;
72 import android.net.wifi.p2p.WifiP2pManager;
73 import android.nfc.NfcManager;
74 import android.os.Binder;
75 import android.os.Bundle;
76 import android.os.Debug;
77 import android.os.DropBoxManager;
78 import android.os.Environment;
79 import android.os.FileUtils;
80 import android.os.Handler;
81 import android.os.IBinder;
82 import android.os.IPowerManager;
83 import android.os.IUserManager;
84 import android.os.Looper;
85 import android.os.PowerManager;
86 import android.os.Process;
87 import android.os.RemoteException;
88 import android.os.ServiceManager;
89 import android.os.UserHandle;
90 import android.os.SystemVibrator;
91 import android.os.UserManager;
92 import android.os.storage.StorageManager;
93 import android.telephony.TelephonyManager;
94 import android.content.ClipboardManager;
95 import android.util.AndroidRuntimeException;
96 import android.util.Log;
97 import android.util.Slog;
98 import android.view.CompatibilityInfoHolder;
99 import android.view.ContextThemeWrapper;
100 import android.view.Display;
101 import android.view.WindowManagerImpl;
102 import android.view.accessibility.AccessibilityManager;
103 import android.view.inputmethod.InputMethodManager;
104 import android.view.textservice.TextServicesManager;
105 import android.accounts.AccountManager;
106 import android.accounts.IAccountManager;
107 import android.app.admin.DevicePolicyManager;
108 
109 import com.android.internal.app.IAppOpsService;
110 import com.android.internal.os.IDropBoxManagerService;
111 
112 import java.io.File;
113 import java.io.FileInputStream;
114 import java.io.FileNotFoundException;
115 import java.io.FileOutputStream;
116 import java.io.IOException;
117 import java.io.InputStream;
118 import java.util.ArrayList;
119 import java.util.HashMap;
120 
121 class ReceiverRestrictedContext extends ContextWrapper {
ReceiverRestrictedContext(Context base)122     ReceiverRestrictedContext(Context base) {
123         super(base);
124     }
125 
126     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)127     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
128         return registerReceiver(receiver, filter, null, null);
129     }
130 
131     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)132     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
133             String broadcastPermission, Handler scheduler) {
134         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         }
142     }
143 
144     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)145     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
146             IntentFilter filter, String broadcastPermission, Handler scheduler) {
147         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         }
155     }
156 
157     @Override
bindService(Intent service, ServiceConnection conn, int flags)158     public boolean bindService(Intent service, ServiceConnection conn, int flags) {
159         throw new ReceiverCallNotAllowedException(
160                 "BroadcastReceiver components are not allowed to bind to services");
161     }
162 }
163 
164 /**
165  * Common implementation of Context API, which provides the base
166  * context object for Activity and other application components.
167  */
168 class ContextImpl extends Context {
169     private final static String TAG = "ContextImpl";
170     private final static boolean DEBUG = false;
171 
172     private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
173             new HashMap<String, SharedPreferencesImpl>();
174 
175     /*package*/ LoadedApk mPackageInfo;
176     private String mBasePackageName;
177     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;
185     private Display mDisplay; // may be null if default display
186     private Context mReceiverRestrictedContext = null;
187     private boolean mRestricted;
188     private UserHandle mUser;
189 
190     private final Object mSync = new Object();
191 
192     private File mDatabasesDir;
193     private File mPreferencesDir;
194     private File mFilesDir;
195     private File mCacheDir;
196     private File mObbDir;
197     private File mExternalFilesDir;
198     private File mExternalCacheDir;
199 
200     private static final String[] EMPTY_FILE_LIST = {};
201 
202     /**
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          */
getService(ContextImpl ctx)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          */
createService(ContextImpl ctx)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
getService(ContextImpl unused)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 
createStaticService()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;
registerService(String serviceName, ServiceFetcher fetcher)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 {
registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }})286         registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
287                 public Object getService(ContextImpl ctx) {
288                     return AccessibilityManager.getInstance(ctx);
289                 }});
290 
registerService(ACCOUNT_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); IAccountManager service = IAccountManager.Stub.asInterface(b); return new AccountManager(ctx, service); }})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 
registerService(ACTIVITY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})298         registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
299                 public Object createService(ContextImpl ctx) {
300                     return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
301                 }});
302 
registerService(ALARM_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(ALARM_SERVICE); IAlarmManager service = IAlarmManager.Stub.asInterface(b); return new AlarmManager(service); }})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 
registerService(AUDIO_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new AudioManager(ctx); }})310         registerService(AUDIO_SERVICE, new ServiceFetcher() {
311                 public Object createService(ContextImpl ctx) {
312                     return new AudioManager(ctx);
313                 }});
314 
registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new MediaRouter(ctx); }})315         registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() {
316                 public Object createService(ContextImpl ctx) {
317                     return new MediaRouter(ctx);
318                 }});
319 
registerService(BLUETOOTH_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new BluetoothManager(ctx); }})320         registerService(BLUETOOTH_SERVICE, new ServiceFetcher() {
321                 public Object createService(ContextImpl ctx) {
322                     return new BluetoothManager(ctx);
323                 }});
324 
registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new ClipboardManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})325         registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
326                 public Object createService(ContextImpl ctx) {
327                     return new ClipboardManager(ctx.getOuterContext(),
328                             ctx.mMainThread.getHandler());
329                 }});
330 
registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); }})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 
registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); return new CountryDetector(ICountryDetector.Stub.asInterface(b)); }})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 
registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); }})343         registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
344                 public Object createService(ContextImpl ctx) {
345                     return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
346                 }});
347 
registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); }})348         registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
349                 public Object createService(ContextImpl ctx) {
350                     return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
351                 }});
352 
registerService(NFC_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new NfcManager(ctx); }})353         registerService(NFC_SERVICE, new ServiceFetcher() {
354                 public Object createService(ContextImpl ctx) {
355                     return new NfcManager(ctx);
356                 }});
357 
registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { return createDropBoxManager(); }})358         registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
359                 public Object createStaticService() {
360                     return createDropBoxManager();
361                 }});
362 
registerService(INPUT_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { return InputManager.getInstance(); }})363         registerService(INPUT_SERVICE, new StaticServiceFetcher() {
364                 public Object createStaticService() {
365                     return InputManager.getInstance();
366                 }});
367 
registerService(DISPLAY_SERVICE, new ServiceFetcher() { @Override public Object createService(ContextImpl ctx) { return new DisplayManager(ctx.getOuterContext()); }})368         registerService(DISPLAY_SERVICE, new ServiceFetcher() {
369                 @Override
370                 public Object createService(ContextImpl ctx) {
371                     return new DisplayManager(ctx.getOuterContext());
372                 }});
373 
registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { return InputMethodManager.getInstance(); }})374         registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() {
375                 public Object createStaticService() {
376                     return InputMethodManager.getInstance();
377                 }});
378 
registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return TextServicesManager.getInstance(); }})379         registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
380                 public Object createService(ContextImpl ctx) {
381                     return TextServicesManager.getInstance();
382                 }});
383 
registerService(KEYGUARD_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return new KeyguardManager(); }})384         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 
registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); }})393         registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
394                 public Object createService(ContextImpl ctx) {
395                     return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
396                 }});
397 
registerService(LOCATION_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(LOCATION_SERVICE); return new LocationManager(ctx, ILocationManager.Stub.asInterface(b)); }})398         registerService(LOCATION_SERVICE, new ServiceFetcher() {
399                 public Object createService(ContextImpl ctx) {
400                     IBinder b = ServiceManager.getService(LOCATION_SERVICE);
401                     return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
402                 }});
403 
registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() { @Override public Object createService(ContextImpl ctx) { return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface( ServiceManager.getService(NETWORK_POLICY_SERVICE))); } })404         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 
registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { final Context outerContext = ctx.getOuterContext(); return new NotificationManager( new ContextThemeWrapper(outerContext, Resources.selectSystemTheme(0, outerContext.getApplicationInfo().targetSdkVersion, com.android.internal.R.style.Theme_Dialog, com.android.internal.R.style.Theme_Holo_Dialog, com.android.internal.R.style.Theme_DeviceDefault_Dialog)), ctx.mMainThread.getHandler()); }})412         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,
417                                 Resources.selectSystemTheme(0,
418                                         outerContext.getApplicationInfo().targetSdkVersion,
419                                         com.android.internal.R.style.Theme_Dialog,
420                                         com.android.internal.R.style.Theme_Holo_Dialog,
421                                         com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
422                         ctx.mMainThread.getHandler());
423                 }});
424 
registerService(NSD_SERVICE, new ServiceFetcher() { @Override public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(NSD_SERVICE); INsdManager service = INsdManager.Stub.asInterface(b); return new NsdManager(ctx.getOuterContext(), service); }})425         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);
430                     return new NsdManager(ctx.getOuterContext(), service);
431                 }});
432 
433         // 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...
registerService(POWER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(POWER_SERVICE); IPowerManager service = IPowerManager.Stub.asInterface(b); return new PowerManager(ctx.getOuterContext(), service, ctx.mMainThread.getHandler()); }})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);
440                     return new PowerManager(ctx.getOuterContext(),
441                             service, ctx.mMainThread.getHandler());
442                 }});
443 
registerService(SEARCH_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new SearchManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})444         registerService(SEARCH_SERVICE, new ServiceFetcher() {
445                 public Object createService(ContextImpl ctx) {
446                     return new SearchManager(ctx.getOuterContext(),
447                             ctx.mMainThread.getHandler());
448                 }});
449 
registerService(SENSOR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new SystemSensorManager(ctx.getOuterContext(), ctx.mMainThread.getHandler().getLooper()); }})450         registerService(SENSOR_SERVICE, new ServiceFetcher() {
451                 public Object createService(ContextImpl ctx) {
452                     return new SystemSensorManager(ctx.getOuterContext(),
453                       ctx.mMainThread.getHandler().getLooper());
454                 }});
455 
registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new StatusBarManager(ctx.getOuterContext()); }})456         registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
457                 public Object createService(ContextImpl ctx) {
458                     return new StatusBarManager(ctx.getOuterContext());
459                 }});
460 
registerService(STORAGE_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { try { return new StorageManager( ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper()); } catch (RemoteException rex) { Log.e(TAG, "Failed to create StorageManager", rex); return null; } }})461         registerService(STORAGE_SERVICE, new ServiceFetcher() {
462                 public Object createService(ContextImpl ctx) {
463                     try {
464                         return new StorageManager(
465                                 ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper());
466                     } catch (RemoteException rex) {
467                         Log.e(TAG, "Failed to create StorageManager", rex);
468                         return null;
469                     }
470                 }});
471 
registerService(TELEPHONY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new TelephonyManager(ctx.getOuterContext()); }})472         registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
473                 public Object createService(ContextImpl ctx) {
474                     return new TelephonyManager(ctx.getOuterContext());
475                 }});
476 
registerService(UI_MODE_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new UiModeManager(); }})477         registerService(UI_MODE_SERVICE, new ServiceFetcher() {
478                 public Object createService(ContextImpl ctx) {
479                     return new UiModeManager();
480                 }});
481 
registerService(USB_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(USB_SERVICE); return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); }})482         registerService(USB_SERVICE, new ServiceFetcher() {
483                 public Object createService(ContextImpl ctx) {
484                     IBinder b = ServiceManager.getService(USB_SERVICE);
485                     return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
486                 }});
487 
registerService(SERIAL_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(SERIAL_SERVICE); return new SerialManager(ctx, ISerialManager.Stub.asInterface(b)); }})488         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 
registerService(VIBRATOR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new SystemVibrator(ctx); }})494         registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
495                 public Object createService(ContextImpl ctx) {
496                     return new SystemVibrator(ctx);
497                 }});
498 
registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER)499         registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
500 
registerService(WIFI_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(WIFI_SERVICE); IWifiManager service = IWifiManager.Stub.asInterface(b); return new WifiManager(ctx.getOuterContext(), service); }})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);
505                     return new WifiManager(ctx.getOuterContext(), service);
506                 }});
507 
registerService(WIFI_P2P_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE); IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); return new WifiP2pManager(service); }})508         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 
registerService(WINDOW_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { Display display = ctx.mDisplay; if (display == null) { DisplayManager dm = (DisplayManager)ctx.getOuterContext().getSystemService( Context.DISPLAY_SERVICE); display = dm.getDisplay(Display.DEFAULT_DISPLAY); } return new WindowManagerImpl(display); }})515         registerService(WINDOW_SERVICE, new ServiceFetcher() {
516                 public Object getService(ContextImpl ctx) {
517                     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);
524                 }});
525 
registerService(USER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(USER_SERVICE); IUserManager service = IUserManager.Stub.asInterface(b); return new UserManager(ctx, service); }})526         registerService(USER_SERVICE, new ServiceFetcher() {
527             public Object createService(ContextImpl ctx) {
528                 IBinder b = ServiceManager.getService(USER_SERVICE);
529                 IUserManager service = IUserManager.Stub.asInterface(b);
530                 return new UserManager(ctx, service);
531             }});
532 
registerService(APP_OPS_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(APP_OPS_SERVICE); IAppOpsService service = IAppOpsService.Stub.asInterface(b); return new AppOpsManager(ctx, service); }})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             }});
539     }
540 
getImpl(Context context)541     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 
550     // 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 
555     @Override
getAssets()556     public AssetManager getAssets() {
557         return getResources().getAssets();
558     }
559 
560     @Override
getResources()561     public Resources getResources() {
562         return mResources;
563     }
564 
565     @Override
getPackageManager()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
getContentResolver()581     public ContentResolver getContentResolver() {
582         return mContentResolver;
583     }
584 
585     @Override
getMainLooper()586     public Looper getMainLooper() {
587         return mMainThread.getLooper();
588     }
589 
590     @Override
getApplicationContext()591     public Context getApplicationContext() {
592         return (mPackageInfo != null) ?
593                 mPackageInfo.getApplication() : mMainThread.getApplication();
594     }
595 
596     @Override
setTheme(int resid)597     public void setTheme(int resid) {
598         mThemeResource = resid;
599     }
600 
601     @Override
getThemeResId()602     public int getThemeResId() {
603         return mThemeResource;
604     }
605 
606     @Override
getTheme()607     public Resources.Theme getTheme() {
608         if (mTheme == null) {
609             mThemeResource = Resources.selectDefaultTheme(mThemeResource,
610                     getOuterContext().getApplicationInfo().targetSdkVersion);
611             mTheme = mResources.newTheme();
612             mTheme.applyStyle(mThemeResource, true);
613         }
614         return mTheme;
615     }
616 
617     @Override
getClassLoader()618     public ClassLoader getClassLoader() {
619         return mPackageInfo != null ?
620                 mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
621     }
622 
623     @Override
getPackageName()624     public String getPackageName() {
625         if (mPackageInfo != null) {
626             return mPackageInfo.getPackageName();
627         }
628         // No mPackageInfo means this is a Context for the system itself,
629         // and this here is its name.
630         return "android";
631     }
632 
633     /** @hide */
634     @Override
getBasePackageName()635     public String getBasePackageName() {
636         return mBasePackageName != null ? mBasePackageName : getPackageName();
637     }
638 
639     @Override
getApplicationInfo()640     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
getPackageResourcePath()648     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
getPackageCodePath()656     public String getPackageCodePath() {
657         if (mPackageInfo != null) {
658             return mPackageInfo.getAppDir();
659         }
660         throw new RuntimeException("Not supported in system context");
661     }
662 
getSharedPrefsFile(String name)663     public File getSharedPrefsFile(String name) {
664         return makeFilename(getPreferencesDir(), name + ".xml");
665     }
666 
667     @Override
getSharedPreferences(String name, int mode)668     public SharedPreferences getSharedPreferences(String name, int mode) {
669         SharedPreferencesImpl sp;
670         synchronized (sSharedPrefs) {
671             sp = sSharedPrefs.get(name);
672             if (sp == null) {
673                 File prefsFile = getSharedPrefsFile(name);
674                 sp = new SharedPreferencesImpl(prefsFile, mode);
675                 sSharedPrefs.put(name, sp);
676                 return sp;
677             }
678         }
679         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         }
686         return sp;
687     }
688 
getPreferencesDir()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
openFileInput(String name)699     public FileInputStream openFileInput(String name)
700         throws FileNotFoundException {
701         File f = makeFilename(getFilesDir(), name);
702         return new FileInputStream(f);
703     }
704 
705     @Override
openFileOutput(String name, int mode)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
deleteFile(String name)729     public boolean deleteFile(String name) {
730         File f = makeFilename(getFilesDir(), name);
731         return f.delete();
732     }
733 
734     @Override
getFilesDir()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()) {
742                     Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
743                     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     }
753 
754     @Override
getExternalFilesDir(String type)755     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     }
785 
786     @Override
getObbDir()787     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
getCacheDir()798     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()) {
805                     Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath());
806                     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     }
816 
817     @Override
getExternalCacheDir()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     }
838 
839     @Override
getFileStreamPath(String name)840     public File getFileStreamPath(String name) {
841         return makeFilename(getFilesDir(), name);
842     }
843 
844     @Override
fileList()845     public String[] fileList() {
846         final String[] list = getFilesDir().list();
847         return (list != null) ? list : EMPTY_FILE_LIST;
848     }
849 
850     @Override
openOrCreateDatabase(String name, int mode, CursorFactory factory)851     public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
852         return openOrCreateDatabase(name, mode, factory, null);
853     }
854 
855     @Override
openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler)856     public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
857             DatabaseErrorHandler errorHandler) {
858         File f = validateFilePath(name, true);
859         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);
864         setFilePermissionsFromMode(f.getPath(), mode, 0);
865         return db;
866     }
867 
868     @Override
deleteDatabase(String name)869     public boolean deleteDatabase(String name) {
870         try {
871             File f = validateFilePath(name, false);
872             return SQLiteDatabase.deleteDatabase(f);
873         } catch (Exception e) {
874         }
875         return false;
876     }
877 
878     @Override
getDatabasePath(String name)879     public File getDatabasePath(String name) {
880         return validateFilePath(name, false);
881     }
882 
883     @Override
databaseList()884     public String[] databaseList() {
885         final String[] list = getDatabasesDir().list();
886         return (list != null) ? list : EMPTY_FILE_LIST;
887     }
888 
889 
getDatabasesDir()890     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     }
901 
902     @Override
getWallpaper()903     public Drawable getWallpaper() {
904         return getWallpaperManager().getDrawable();
905     }
906 
907     @Override
peekWallpaper()908     public Drawable peekWallpaper() {
909         return getWallpaperManager().peekDrawable();
910     }
911 
912     @Override
getWallpaperDesiredMinimumWidth()913     public int getWallpaperDesiredMinimumWidth() {
914         return getWallpaperManager().getDesiredMinimumWidth();
915     }
916 
917     @Override
getWallpaperDesiredMinimumHeight()918     public int getWallpaperDesiredMinimumHeight() {
919         return getWallpaperManager().getDesiredMinimumHeight();
920     }
921 
922     @Override
setWallpaper(Bitmap bitmap)923     public void setWallpaper(Bitmap bitmap) throws IOException  {
924         getWallpaperManager().setBitmap(bitmap);
925     }
926 
927     @Override
setWallpaper(InputStream data)928     public void setWallpaper(InputStream data) throws IOException {
929         getWallpaperManager().setStream(data);
930     }
931 
932     @Override
clearWallpaper()933     public void clearWallpaper() throws IOException {
934         getWallpaperManager().clear();
935     }
936 
937     @Override
startActivity(Intent intent)938     public void startActivity(Intent intent) {
939         warnIfCallingFromSystemProcess();
940         startActivity(intent, null);
941     }
942 
943     /** @hide */
944     @Override
startActivityAsUser(Intent intent, UserHandle user)945     public void startActivityAsUser(Intent intent, UserHandle user) {
946         startActivityAsUser(intent, null, user);
947     }
948 
949     @Override
startActivity(Intent intent, Bundle options)950     public void startActivity(Intent intent, Bundle options) {
951         warnIfCallingFromSystemProcess();
952         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(
959             getOuterContext(), mMainThread.getApplicationThread(), null,
960             (Activity)null, intent, -1, options);
961     }
962 
963     /** @hide */
964     @Override
startActivityAsUser(Intent intent, Bundle options, UserHandle user)965     public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
966         try {
967             ActivityManagerNative.getDefault().startActivityAsUser(
968                 mMainThread.getApplicationThread(), getBasePackageName(), intent,
969                 intent.resolveTypeIfNeeded(getContentResolver()),
970                 null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options,
971                 user.getIdentifier());
972         } catch (RemoteException re) {
973         }
974     }
975 
976     @Override
startActivities(Intent[] intents)977     public void startActivities(Intent[] intents) {
978         warnIfCallingFromSystemProcess();
979         startActivities(intents, null);
980     }
981 
982     /** @hide */
983     @Override
startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle)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 
996     @Override
startActivities(Intent[] intents, Bundle options)997     public void startActivities(Intent[] intents, Bundle options) {
998         warnIfCallingFromSystemProcess();
999         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,
1007             (Activity)null, intents, options);
1008     }
1009 
1010     @Override
startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)1011     public void startIntentSender(IntentSender intent,
1012             Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1013             throws IntentSender.SendIntentException {
1014         startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
1015     }
1016 
1017     @Override
startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options)1018     public void startIntentSender(IntentSender intent, Intent fillInIntent,
1019             int flagsMask, int flagsValues, int extraFlags, Bundle options)
1020             throws IntentSender.SendIntentException {
1021         try {
1022             String resolvedType = null;
1023             if (fillInIntent != null) {
1024                 fillInIntent.migrateExtraStreamToClipData();
1025                 fillInIntent.prepareToLeaveProcess();
1026                 resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
1027             }
1028             int result = ActivityManagerNative.getDefault()
1029                 .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
1030                         fillInIntent, resolvedType, null, null,
1031                         0, flagsMask, flagsValues, options);
1032             if (result == ActivityManager.START_CANCELED) {
1033                 throw new IntentSender.SendIntentException();
1034             }
1035             Instrumentation.checkStartActivityResult(result, null);
1036         } catch (RemoteException e) {
1037         }
1038     }
1039 
1040     @Override
sendBroadcast(Intent intent)1041     public void sendBroadcast(Intent intent) {
1042         warnIfCallingFromSystemProcess();
1043         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1044         try {
1045             intent.prepareToLeaveProcess();
1046             ActivityManagerNative.getDefault().broadcastIntent(
1047                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1048                 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false,
1049                 getUserId());
1050         } catch (RemoteException e) {
1051         }
1052     }
1053 
1054     @Override
sendBroadcast(Intent intent, String receiverPermission)1055     public void sendBroadcast(Intent intent, String receiverPermission) {
1056         warnIfCallingFromSystemProcess();
1057         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1058         try {
1059             intent.prepareToLeaveProcess();
1060             ActivityManagerNative.getDefault().broadcastIntent(
1061                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1062                 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE,
1063                 false, false, getUserId());
1064         } catch (RemoteException e) {
1065         }
1066     }
1067 
1068     @Override
sendBroadcast(Intent intent, String receiverPermission, int appOp)1069     public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1070         warnIfCallingFromSystemProcess();
1071         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1072         try {
1073             intent.prepareToLeaveProcess();
1074             ActivityManagerNative.getDefault().broadcastIntent(
1075                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1076                 Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
1077                 getUserId());
1078         } catch (RemoteException e) {
1079         }
1080     }
1081 
1082     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)1083     public void sendOrderedBroadcast(Intent intent,
1084             String receiverPermission) {
1085         warnIfCallingFromSystemProcess();
1086         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1087         try {
1088             intent.prepareToLeaveProcess();
1089             ActivityManagerNative.getDefault().broadcastIntent(
1090                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1091                 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false,
1092                 getUserId());
1093         } catch (RemoteException e) {
1094         }
1095     }
1096 
1097     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1098     public void sendOrderedBroadcast(Intent intent,
1099             String receiverPermission, BroadcastReceiver resultReceiver,
1100             Handler scheduler, int initialCode, String initialData,
1101             Bundle initialExtras) {
1102         sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE,
1103                 resultReceiver, scheduler, initialCode, initialData, initialExtras);
1104     }
1105 
1106     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1107     public void sendOrderedBroadcast(Intent intent,
1108             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1109             Handler scheduler, int initialCode, String initialData,
1110             Bundle initialExtras) {
1111         warnIfCallingFromSystemProcess();
1112         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                 }
1125                 rd = new LoadedApk.ReceiverDispatcher(
1126                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1127             }
1128         }
1129         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1130         try {
1131             intent.prepareToLeaveProcess();
1132             ActivityManagerNative.getDefault().broadcastIntent(
1133                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1134                 initialCode, initialData, initialExtras, receiverPermission, appOp,
1135                     true, false, getUserId());
1136         } catch (RemoteException e) {
1137         }
1138     }
1139 
1140     @Override
sendBroadcastAsUser(Intent intent, UserHandle user)1141     public void sendBroadcastAsUser(Intent intent, UserHandle user) {
1142         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1143         try {
1144             intent.prepareToLeaveProcess();
1145             ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
1146                     intent, resolvedType, null, Activity.RESULT_OK, null, null, null,
1147                     AppOpsManager.OP_NONE, false, false, user.getIdentifier());
1148         } catch (RemoteException e) {
1149         }
1150     }
1151 
1152     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)1153     public void sendBroadcastAsUser(Intent intent, UserHandle user,
1154             String receiverPermission) {
1155         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1156         try {
1157             intent.prepareToLeaveProcess();
1158             ActivityManagerNative.getDefault().broadcastIntent(
1159                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1160                 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false,
1161                 user.getIdentifier());
1162         } catch (RemoteException e) {
1163         }
1164     }
1165 
1166     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1167     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1168             String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
1169             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 {
1189             intent.prepareToLeaveProcess();
1190             ActivityManagerNative.getDefault().broadcastIntent(
1191                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1192                 initialCode, initialData, initialExtras, receiverPermission,
1193                     AppOpsManager.OP_NONE, true, false, user.getIdentifier());
1194         } catch (RemoteException e) {
1195         }
1196     }
1197 
1198     @Override
sendStickyBroadcast(Intent intent)1199     public void sendStickyBroadcast(Intent intent) {
1200         warnIfCallingFromSystemProcess();
1201         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1202         try {
1203             intent.prepareToLeaveProcess();
1204             ActivityManagerNative.getDefault().broadcastIntent(
1205                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1206                 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true,
1207                 getUserId());
1208         } catch (RemoteException e) {
1209         }
1210     }
1211 
1212     @Override
sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1213     public void sendStickyOrderedBroadcast(Intent intent,
1214             BroadcastReceiver resultReceiver,
1215             Handler scheduler, int initialCode, String initialData,
1216             Bundle initialExtras) {
1217         warnIfCallingFromSystemProcess();
1218         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                 }
1231                 rd = new LoadedApk.ReceiverDispatcher(
1232                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1233             }
1234         }
1235         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1236         try {
1237             intent.prepareToLeaveProcess();
1238             ActivityManagerNative.getDefault().broadcastIntent(
1239                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1240                 initialCode, initialData, initialExtras, null,
1241                     AppOpsManager.OP_NONE, true, true, getUserId());
1242         } catch (RemoteException e) {
1243         }
1244     }
1245 
1246     @Override
removeStickyBroadcast(Intent intent)1247     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 {
1254             intent.prepareToLeaveProcess();
1255             ActivityManagerNative.getDefault().unbroadcastIntent(
1256                     mMainThread.getApplicationThread(), intent, getUserId());
1257         } catch (RemoteException e) {
1258         }
1259     }
1260 
1261     @Override
sendStickyBroadcastAsUser(Intent intent, UserHandle user)1262     public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1263         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1264         try {
1265             intent.prepareToLeaveProcess();
1266             ActivityManagerNative.getDefault().broadcastIntent(
1267                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1268                 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier());
1269         } catch (RemoteException e) {
1270         }
1271     }
1272 
1273     @Override
sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)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 {
1297             intent.prepareToLeaveProcess();
1298             ActivityManagerNative.getDefault().broadcastIntent(
1299                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1300                 initialCode, initialData, initialExtras, null,
1301                     AppOpsManager.OP_NONE, true, true, user.getIdentifier());
1302         } catch (RemoteException e) {
1303         }
1304     }
1305 
1306     @Override
removeStickyBroadcastAsUser(Intent intent, UserHandle user)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 {
1314             intent.prepareToLeaveProcess();
1315             ActivityManagerNative.getDefault().unbroadcastIntent(
1316                     mMainThread.getApplicationThread(), intent, user.getIdentifier());
1317         } catch (RemoteException e) {
1318         }
1319     }
1320 
1321     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)1322     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1323         return registerReceiver(receiver, filter, null, null);
1324     }
1325 
1326     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)1327     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1328             String broadcastPermission, Handler scheduler) {
1329         return registerReceiverInternal(receiver, getUserId(),
1330                 filter, broadcastPermission, scheduler, getOuterContext());
1331     }
1332 
1333     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)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 
registerReceiverInternal(BroadcastReceiver receiver, int userId, IntentFilter filter, String broadcastPermission, Handler scheduler, Context context)1340     private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
1341             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                 }
1356                 rd = new LoadedApk.ReceiverDispatcher(
1357                         receiver, context, scheduler, null, true).getIIntentReceiver();
1358             }
1359         }
1360         try {
1361             return ActivityManagerNative.getDefault().registerReceiver(
1362                     mMainThread.getApplicationThread(), mBasePackageName,
1363                     rd, filter, broadcastPermission, userId);
1364         } catch (RemoteException e) {
1365             return null;
1366         }
1367     }
1368 
1369     @Override
unregisterReceiver(BroadcastReceiver receiver)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
startService(Intent service)1384     public ComponentName startService(Intent service) {
1385         warnIfCallingFromSystemProcess();
1386         return startServiceAsUser(service, mUser);
1387     }
1388 
1389     @Override
stopService(Intent service)1390     public boolean stopService(Intent service) {
1391         warnIfCallingFromSystemProcess();
1392         return stopServiceAsUser(service, mUser);
1393     }
1394 
1395     @Override
startServiceAsUser(Intent service, UserHandle user)1396     public ComponentName startServiceAsUser(Intent service, UserHandle user) {
1397         try {
1398             service.prepareToLeaveProcess();
1399             ComponentName cn = ActivityManagerNative.getDefault().startService(
1400                 mMainThread.getApplicationThread(), service,
1401                 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1402             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                 }
1412             }
1413             return cn;
1414         } catch (RemoteException e) {
1415             return null;
1416         }
1417     }
1418 
1419     @Override
stopServiceAsUser(Intent service, UserHandle user)1420     public boolean stopServiceAsUser(Intent service, UserHandle user) {
1421         try {
1422             service.prepareToLeaveProcess();
1423             int res = ActivityManagerNative.getDefault().stopService(
1424                 mMainThread.getApplicationThread(), service,
1425                 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1426             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
bindService(Intent service, ServiceConnection conn, int flags)1437     public boolean bindService(Intent service, ServiceConnection conn,
1438             int flags) {
1439         warnIfCallingFromSystemProcess();
1440         return bindServiceAsUser(service, conn, flags, Process.myUserHandle());
1441     }
1442 
1443     /** @hide */
1444     @Override
bindServiceAsUser(Intent service, ServiceConnection conn, int flags, UserHandle user)1445     public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
1446             UserHandle user) {
1447         IServiceConnection sd;
1448         if (conn == null) {
1449             throw new IllegalArgumentException("connection is null");
1450         }
1451         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 {
1458             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             }
1464             service.prepareToLeaveProcess();
1465             int res = ActivityManagerNative.getDefault().bindService(
1466                 mMainThread.getApplicationThread(), getActivityToken(),
1467                 service, service.resolveTypeIfNeeded(getContentResolver()),
1468                 sd, flags, user.getIdentifier());
1469             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
unbindService(ServiceConnection conn)1480     public void unbindService(ServiceConnection conn) {
1481         if (conn == null) {
1482             throw new IllegalArgumentException("connection is null");
1483         }
1484         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
startInstrumentation(ComponentName className, String profileFile, Bundle arguments)1497     public boolean startInstrumentation(ComponentName className,
1498             String profileFile, Bundle arguments) {
1499         try {
1500             if (arguments != null) {
1501                 arguments.setAllowFds(false);
1502             }
1503             return ActivityManagerNative.getDefault().startInstrumentation(
1504                     className, profileFile, 0, arguments, null, null, getUserId());
1505         } catch (RemoteException e) {
1506             // System has crashed, nothing we can do.
1507         }
1508         return false;
1509     }
1510 
1511     @Override
getSystemService(String name)1512     public Object getSystemService(String name) {
1513         ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1514         return fetcher == null ? null : fetcher.getService(this);
1515     }
1516 
getWallpaperManager()1517     private WallpaperManager getWallpaperManager() {
1518         return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
1519     }
1520 
createDropBoxManager()1521     /* package */ static DropBoxManager createDropBoxManager() {
1522         IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1523         IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1524         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         }
1531         return new DropBoxManager(service);
1532     }
1533 
1534     @Override
checkPermission(String permission, int pid, int uid)1535     public int checkPermission(String permission, int pid, int uid) {
1536         if (permission == null) {
1537             throw new IllegalArgumentException("permission is null");
1538         }
1539 
1540         try {
1541             return ActivityManagerNative.getDefault().checkPermission(
1542                     permission, pid, uid);
1543         } catch (RemoteException e) {
1544             return PackageManager.PERMISSION_DENIED;
1545         }
1546     }
1547 
1548     @Override
checkCallingPermission(String permission)1549     public int checkCallingPermission(String permission) {
1550         if (permission == null) {
1551             throw new IllegalArgumentException("permission is null");
1552         }
1553 
1554         int pid = Binder.getCallingPid();
1555         if (pid != Process.myPid()) {
1556             return checkPermission(permission, pid, Binder.getCallingUid());
1557         }
1558         return PackageManager.PERMISSION_DENIED;
1559     }
1560 
1561     @Override
checkCallingOrSelfPermission(String permission)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 
enforce( String permission, int resultOfCheck, boolean selfToo, int uid, String message)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 "
1579                      : "uid " + uid + " does not have ") +
1580                     permission +
1581                     ".");
1582         }
1583     }
1584 
enforcePermission( String permission, int pid, int uid, String message)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 
enforceCallingPermission(String permission, String message)1594     public void enforceCallingPermission(String permission, String message) {
1595         enforce(permission,
1596                 checkCallingPermission(permission),
1597                 false,
1598                 Binder.getCallingUid(),
1599                 message);
1600     }
1601 
enforceCallingOrSelfPermission( String permission, String message)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
grantUriPermission(String toPackage, Uri uri, int modeFlags)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
revokeUriPermission(Uri uri, int modeFlags)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
checkUriPermission(Uri uri, int pid, int uid, int modeFlags)1632     public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
1633         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
checkCallingUriPermission(Uri uri, int modeFlags)1642     public int checkCallingUriPermission(Uri uri, int modeFlags) {
1643         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
checkCallingOrSelfUriPermission(Uri uri, int modeFlags)1652     public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
1653         return checkUriPermission(uri, Binder.getCallingPid(),
1654                 Binder.getCallingUid(), modeFlags);
1655     }
1656 
1657     @Override
checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags)1658     public int checkUriPermission(Uri uri, String readPermission,
1659             String writePermission, int pid, int uid, int modeFlags) {
1660         if (DEBUG) {
1661             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 
uriModeFlagToString(int uriModeFlags)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 
enforceForUri( int modeFlags, int resultOfCheck, boolean selfToo, int uid, Uri uri, String message)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 
enforceUriPermission( Uri uri, int pid, int uid, int modeFlags, String message)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 
enforceCallingUriPermission( Uri uri, int modeFlags, String message)1720     public void enforceCallingUriPermission(
1721             Uri uri, int modeFlags, String message) {
1722         enforceForUri(
1723                 modeFlags, checkCallingUriPermission(uri, modeFlags),
1724                 false,
1725                 Binder.getCallingUid(), uri, message);
1726     }
1727 
enforceCallingOrSelfUriPermission( Uri uri, int modeFlags, String message)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 
enforceUriPermission( Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message)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 
warnIfCallingFromSystemProcess()1749     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: "
1752                     + Debug.getCallers(5));
1753         }
1754     }
1755 
1756     @Override
createPackageContext(String packageName, int flags)1757     public Context createPackageContext(String packageName, int flags)
1758             throws NameNotFoundException {
1759         return createPackageContextAsUser(packageName, flags,
1760                 mUser != null ? mUser : Process.myUserHandle());
1761     }
1762 
1763     @Override
createPackageContextAsUser(String packageName, int flags, UserHandle user)1764     public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
1765             throws NameNotFoundException {
1766         if (packageName.equals("system") || packageName.equals("android")) {
1767             final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
1768             context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1769             context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user);
1770             return context;
1771         }
1772 
1773         LoadedApk pi =
1774             mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags,
1775                     user.getIdentifier());
1776         if (pi != null) {
1777             ContextImpl c = new ContextImpl();
1778             c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1779             c.init(pi, null, mMainThread, mResources, mBasePackageName, user);
1780             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 
1790     @Override
createConfigurationContext(Configuration overrideConfiguration)1791     public Context createConfigurationContext(Configuration overrideConfiguration) {
1792         if (overrideConfiguration == null) {
1793             throw new IllegalArgumentException("overrideConfiguration must not be null");
1794         }
1795 
1796         ContextImpl c = new ContextImpl();
1797         c.init(mPackageInfo, null, mMainThread);
1798         c.mResources = mMainThread.getTopLevelResources(
1799                 mPackageInfo.getResDir(),
1800                 getDisplayId(), overrideConfiguration,
1801                 mResources.getCompatibilityInfo());
1802         return c;
1803     }
1804 
1805     @Override
createDisplayContext(Display display)1806     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 
getDisplayId()1826     private int getDisplayId() {
1827         return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
1828     }
1829 
1830     @Override
isRestricted()1831     public boolean isRestricted() {
1832         return mRestricted;
1833     }
1834 
1835     @Override
getCompatibilityInfo(int displayId)1836     public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
1837         return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
1838     }
1839 
getDataDirFile()1840     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
getDir(String name, int mode)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 
1859     /** {@hide} */
getUserId()1860     public int getUserId() {
1861         return mUser.getIdentifier();
1862     }
1863 
createSystemContext(ActivityThread mainThread)1864     static ContextImpl createSystemContext(ActivityThread mainThread) {
1865         final ContextImpl context = new ContextImpl();
1866         context.init(Resources.getSystem(), mainThread, Process.myUserHandle());
1867         return context;
1868     }
1869 
ContextImpl()1870     ContextImpl() {
1871         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      */
ContextImpl(ContextImpl context)1880     public ContextImpl(ContextImpl context) {
1881         mPackageInfo = context.mPackageInfo;
1882         mBasePackageName = context.mBasePackageName;
1883         mResources = context.mResources;
1884         mMainThread = context.mMainThread;
1885         mContentResolver = context.mContentResolver;
1886         mUser = context.mUser;
1887         mDisplay = context.mDisplay;
1888         mOuterContext = this;
1889     }
1890 
init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread)1891     final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
1892         init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
1893     }
1894 
init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, Resources container, String basePackageName, UserHandle user)1895     final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
1896             Resources container, String basePackageName, UserHandle user) {
1897         mPackageInfo = packageInfo;
1898         mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
1899         mResources = mPackageInfo.getResources(mainThread);
1900 
1901         if (mResources != null && container != null
1902                 && container.getCompatibilityInfo().applicationScale !=
1903                         mResources.getCompatibilityInfo().applicationScale) {
1904             if (DEBUG) {
1905                 Log.d(TAG, "loaded context has different scaling. Using container's" +
1906                         " compatiblity info:" + container.getDisplayMetrics());
1907             }
1908             mResources = mainThread.getTopLevelResources(
1909                     mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
1910                     null, container.getCompatibilityInfo());
1911         }
1912         mMainThread = mainThread;
1913         mActivityToken = activityToken;
1914         mContentResolver = new ApplicationContentResolver(this, mainThread, user);
1915         mUser = user;
1916     }
1917 
init(Resources resources, ActivityThread mainThread, UserHandle user)1918     final void init(Resources resources, ActivityThread mainThread, UserHandle user) {
1919         mPackageInfo = null;
1920         mBasePackageName = null;
1921         mResources = resources;
1922         mMainThread = mainThread;
1923         mContentResolver = new ApplicationContentResolver(this, mainThread, user);
1924         mUser = user;
1925     }
1926 
scheduleFinalCleanup(String who, String what)1927     final void scheduleFinalCleanup(String who, String what) {
1928         mMainThread.scheduleContextCleanup(this, who, what);
1929     }
1930 
performFinalCleanup(String who, String what)1931     final void performFinalCleanup(String who, String what) {
1932         //Log.i(TAG, "Cleanup up context: " + this);
1933         mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
1934     }
1935 
getReceiverRestrictedContext()1936     final Context getReceiverRestrictedContext() {
1937         if (mReceiverRestrictedContext != null) {
1938             return mReceiverRestrictedContext;
1939         }
1940         return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
1941     }
1942 
setOuterContext(Context context)1943     final void setOuterContext(Context context) {
1944         mOuterContext = context;
1945     }
1946 
getOuterContext()1947     final Context getOuterContext() {
1948         return mOuterContext;
1949     }
1950 
getActivityToken()1951     final IBinder getActivityToken() {
1952         return mActivityToken;
1953     }
1954 
setFilePermissionsFromMode(String name, int mode, int extraPermissions)1955     static void setFilePermissionsFromMode(String name, int mode,
1956             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         }
1966         if (DEBUG) {
1967             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 
validateFilePath(String name, boolean createDirectory)1973     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 
makeFilename(File base, String name)1996     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(
2001                 "File " + name + " contains a path separator");
2002     }
2003 
2004     // ----------------------------------------------------------------------
2005     // ----------------------------------------------------------------------
2006     // ----------------------------------------------------------------------
2007 
2008     private static final class ApplicationContentResolver extends ContentResolver {
2009         private final ActivityThread mMainThread;
2010         private final UserHandle mUser;
2011 
ApplicationContentResolver( Context context, ActivityThread mainThread, UserHandle user)2012         public ApplicationContentResolver(
2013                 Context context, ActivityThread mainThread, UserHandle user) {
2014             super(context);
2015             mMainThread = Preconditions.checkNotNull(mainThread);
2016             mUser = Preconditions.checkNotNull(user);
2017         }
2018 
2019         @Override
acquireProvider(Context context, String auth)2020         protected IContentProvider acquireProvider(Context context, String auth) {
2021             return mMainThread.acquireProvider(context, auth, mUser.getIdentifier(), true);
2022         }
2023 
2024         @Override
acquireExistingProvider(Context context, String auth)2025         protected IContentProvider acquireExistingProvider(Context context, String auth) {
2026             return mMainThread.acquireExistingProvider(context, auth, mUser.getIdentifier(), true);
2027         }
2028 
2029         @Override
releaseProvider(IContentProvider provider)2030         public boolean releaseProvider(IContentProvider provider) {
2031             return mMainThread.releaseProvider(provider, true);
2032         }
2033 
2034         @Override
acquireUnstableProvider(Context c, String auth)2035         protected IContentProvider acquireUnstableProvider(Context c, String auth) {
2036             return mMainThread.acquireProvider(c, auth, mUser.getIdentifier(), false);
2037         }
2038 
2039         @Override
releaseUnstableProvider(IContentProvider icp)2040         public boolean releaseUnstableProvider(IContentProvider icp) {
2041             return mMainThread.releaseProvider(icp, false);
2042         }
2043 
2044         @Override
unstableProviderDied(IContentProvider icp)2045         public void unstableProviderDied(IContentProvider icp) {
2046             mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
2047         }
2048     }
2049 }
2050