• 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 
21 import android.content.BroadcastReceiver;
22 import android.content.ComponentName;
23 import android.content.ContentResolver;
24 import android.content.Context;
25 import android.content.ContextWrapper;
26 import android.content.IContentProvider;
27 import android.content.Intent;
28 import android.content.IntentFilter;
29 import android.content.IIntentReceiver;
30 import android.content.IntentSender;
31 import android.content.ReceiverCallNotAllowedException;
32 import android.content.ServiceConnection;
33 import android.content.SharedPreferences;
34 import android.content.pm.ApplicationInfo;
35 import android.content.pm.IPackageManager;
36 import android.content.pm.PackageManager;
37 import android.content.res.AssetManager;
38 import android.content.res.CompatibilityInfo;
39 import android.content.res.Resources;
40 import android.database.DatabaseErrorHandler;
41 import android.database.sqlite.SQLiteDatabase;
42 import android.database.sqlite.SQLiteDatabase.CursorFactory;
43 import android.graphics.Bitmap;
44 import android.graphics.drawable.Drawable;
45 import android.hardware.SensorManager;
46 import android.hardware.usb.IUsbManager;
47 import android.hardware.usb.UsbManager;
48 import android.location.CountryDetector;
49 import android.location.ICountryDetector;
50 import android.location.ILocationManager;
51 import android.location.LocationManager;
52 import android.media.AudioManager;
53 import android.net.ConnectivityManager;
54 import android.net.IConnectivityManager;
55 import android.net.INetworkPolicyManager;
56 import android.net.NetworkPolicyManager;
57 import android.net.ThrottleManager;
58 import android.net.IThrottleManager;
59 import android.net.Uri;
60 import android.net.wifi.IWifiManager;
61 import android.net.wifi.WifiManager;
62 import android.net.wifi.p2p.IWifiP2pManager;
63 import android.net.wifi.p2p.WifiP2pManager;
64 import android.nfc.NfcManager;
65 import android.os.Binder;
66 import android.os.Bundle;
67 import android.os.DropBoxManager;
68 import android.os.Environment;
69 import android.os.FileUtils;
70 import android.os.Handler;
71 import android.os.IBinder;
72 import android.os.IPowerManager;
73 import android.os.Looper;
74 import android.os.PowerManager;
75 import android.os.Process;
76 import android.os.RemoteException;
77 import android.os.ServiceManager;
78 import android.os.Vibrator;
79 import android.os.storage.StorageManager;
80 import android.telephony.TelephonyManager;
81 import android.content.ClipboardManager;
82 import android.util.AndroidRuntimeException;
83 import android.util.Log;
84 import android.view.ContextThemeWrapper;
85 import android.view.WindowManagerImpl;
86 import android.view.accessibility.AccessibilityManager;
87 import android.view.inputmethod.InputMethodManager;
88 import android.view.textservice.TextServicesManager;
89 import android.accounts.AccountManager;
90 import android.accounts.IAccountManager;
91 import android.app.admin.DevicePolicyManager;
92 import com.android.internal.os.IDropBoxManagerService;
93 
94 import java.io.File;
95 import java.io.FileInputStream;
96 import java.io.FileNotFoundException;
97 import java.io.FileOutputStream;
98 import java.io.IOException;
99 import java.io.InputStream;
100 import java.util.ArrayList;
101 import java.util.HashMap;
102 
103 class ReceiverRestrictedContext extends ContextWrapper {
ReceiverRestrictedContext(Context base)104     ReceiverRestrictedContext(Context base) {
105         super(base);
106     }
107 
108     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)109     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
110         return registerReceiver(receiver, filter, null, null);
111     }
112 
113     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)114     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
115             String broadcastPermission, Handler scheduler) {
116         throw new ReceiverCallNotAllowedException(
117                 "IntentReceiver components are not allowed to register to receive intents");
118         //ex.fillInStackTrace();
119         //Log.e("IntentReceiver", ex.getMessage(), ex);
120         //return mContext.registerReceiver(receiver, filter, broadcastPermission,
121         //        scheduler);
122     }
123 
124     @Override
bindService(Intent service, ServiceConnection conn, int flags)125     public boolean bindService(Intent service, ServiceConnection conn, int flags) {
126         throw new ReceiverCallNotAllowedException(
127                 "IntentReceiver components are not allowed to bind to services");
128         //ex.fillInStackTrace();
129         //Log.e("IntentReceiver", ex.getMessage(), ex);
130         //return mContext.bindService(service, interfaceName, conn, flags);
131     }
132 }
133 
134 /**
135  * Common implementation of Context API, which provides the base
136  * context object for Activity and other application components.
137  */
138 class ContextImpl extends Context {
139     private final static String TAG = "ApplicationContext";
140     private final static boolean DEBUG = false;
141 
142     private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
143             new HashMap<String, SharedPreferencesImpl>();
144 
145     /*package*/ LoadedApk mPackageInfo;
146     private String mBasePackageName;
147     private Resources mResources;
148     /*package*/ ActivityThread mMainThread;
149     private Context mOuterContext;
150     private IBinder mActivityToken = null;
151     private ApplicationContentResolver mContentResolver;
152     private int mThemeResource = 0;
153     private Resources.Theme mTheme = null;
154     private PackageManager mPackageManager;
155     private Context mReceiverRestrictedContext = null;
156     private boolean mRestricted;
157 
158     private final Object mSync = new Object();
159 
160     private File mDatabasesDir;
161     private File mPreferencesDir;
162     private File mFilesDir;
163     private File mCacheDir;
164     private File mObbDir;
165     private File mExternalFilesDir;
166     private File mExternalCacheDir;
167 
168     private static final String[] EMPTY_FILE_LIST = {};
169 
170     /**
171      * Override this class when the system service constructor needs a
172      * ContextImpl.  Else, use StaticServiceFetcher below.
173      */
174     /*package*/ static class ServiceFetcher {
175         int mContextCacheIndex = -1;
176 
177         /**
178          * Main entrypoint; only override if you don't need caching.
179          */
getService(ContextImpl ctx)180         public Object getService(ContextImpl ctx) {
181             ArrayList<Object> cache = ctx.mServiceCache;
182             Object service;
183             synchronized (cache) {
184                 if (cache.size() == 0) {
185                     // Initialize the cache vector on first access.
186                     // At this point sNextPerContextServiceCacheIndex
187                     // is the number of potential services that are
188                     // cached per-Context.
189                     for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
190                         cache.add(null);
191                     }
192                 } else {
193                     service = cache.get(mContextCacheIndex);
194                     if (service != null) {
195                         return service;
196                     }
197                 }
198                 service = createService(ctx);
199                 cache.set(mContextCacheIndex, service);
200                 return service;
201             }
202         }
203 
204         /**
205          * Override this to create a new per-Context instance of the
206          * service.  getService() will handle locking and caching.
207          */
createService(ContextImpl ctx)208         public Object createService(ContextImpl ctx) {
209             throw new RuntimeException("Not implemented");
210         }
211     }
212 
213     /**
214      * Override this class for services to be cached process-wide.
215      */
216     abstract static class StaticServiceFetcher extends ServiceFetcher {
217         private Object mCachedInstance;
218 
219         @Override
getService(ContextImpl unused)220         public final Object getService(ContextImpl unused) {
221             synchronized (StaticServiceFetcher.this) {
222                 Object service = mCachedInstance;
223                 if (service != null) {
224                     return service;
225                 }
226                 return mCachedInstance = createStaticService();
227             }
228         }
229 
createStaticService()230         public abstract Object createStaticService();
231     }
232 
233     private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
234             new HashMap<String, ServiceFetcher>();
235 
236     private static int sNextPerContextServiceCacheIndex = 0;
registerService(String serviceName, ServiceFetcher fetcher)237     private static void registerService(String serviceName, ServiceFetcher fetcher) {
238         if (!(fetcher instanceof StaticServiceFetcher)) {
239             fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
240         }
241         SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
242     }
243 
244     // This one's defined separately and given a variable name so it
245     // can be re-used by getWallpaperManager(), avoiding a HashMap
246     // lookup.
247     private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
248             public Object createService(ContextImpl ctx) {
249                 return new WallpaperManager(ctx.getOuterContext(),
250                         ctx.mMainThread.getHandler());
251             }};
252 
253     static {
registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }})254         registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
255                 public Object getService(ContextImpl ctx) {
256                     return AccessibilityManager.getInstance(ctx);
257                 }});
258 
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); }})259         registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
260                 public Object createService(ContextImpl ctx) {
261                     IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
262                     IAccountManager service = IAccountManager.Stub.asInterface(b);
263                     return new AccountManager(ctx, service);
264                 }});
265 
registerService(ACTIVITY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})266         registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
267                 public Object createService(ContextImpl ctx) {
268                     return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
269                 }});
270 
registerService(ALARM_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(ALARM_SERVICE); IAlarmManager service = IAlarmManager.Stub.asInterface(b); return new AlarmManager(service); }})271         registerService(ALARM_SERVICE, new StaticServiceFetcher() {
272                 public Object createStaticService() {
273                     IBinder b = ServiceManager.getService(ALARM_SERVICE);
274                     IAlarmManager service = IAlarmManager.Stub.asInterface(b);
275                     return new AlarmManager(service);
276                 }});
277 
registerService(AUDIO_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new AudioManager(ctx); }})278         registerService(AUDIO_SERVICE, new ServiceFetcher() {
279                 public Object createService(ContextImpl ctx) {
280                     return new AudioManager(ctx);
281                 }});
282 
registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new ClipboardManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})283         registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
284                 public Object createService(ContextImpl ctx) {
285                     return new ClipboardManager(ctx.getOuterContext(),
286                             ctx.mMainThread.getHandler());
287                 }});
288 
registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); }})289         registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
290                 public Object createStaticService() {
291                     IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
292                     return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
293                 }});
294 
registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); return new CountryDetector(ICountryDetector.Stub.asInterface(b)); }})295         registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
296                 public Object createStaticService() {
297                     IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
298                     return new CountryDetector(ICountryDetector.Stub.asInterface(b));
299                 }});
300 
registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); }})301         registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
302                 public Object createService(ContextImpl ctx) {
303                     return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
304                 }});
305 
registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); }})306         registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
307                 public Object createService(ContextImpl ctx) {
308                     return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
309                 }});
310 
registerService(NFC_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new NfcManager(ctx); }})311         registerService(NFC_SERVICE, new ServiceFetcher() {
312                 public Object createService(ContextImpl ctx) {
313                     return new NfcManager(ctx);
314                 }});
315 
registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { return createDropBoxManager(); }})316         registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
317                 public Object createStaticService() {
318                     return createDropBoxManager();
319                 }});
320 
registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return InputMethodManager.getInstance(ctx); }})321         registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
322                 public Object createService(ContextImpl ctx) {
323                     return InputMethodManager.getInstance(ctx);
324                 }});
325 
registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return TextServicesManager.getInstance(); }})326         registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
327                 public Object createService(ContextImpl ctx) {
328                     return TextServicesManager.getInstance();
329                 }});
330 
registerService(KEYGUARD_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return new KeyguardManager(); }})331         registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
332                 public Object getService(ContextImpl ctx) {
333                     // TODO: why isn't this caching it?  It wasn't
334                     // before, so I'm preserving the old behavior and
335                     // using getService(), instead of createService()
336                     // which would do the caching.
337                     return new KeyguardManager();
338                 }});
339 
registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); }})340         registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
341                 public Object createService(ContextImpl ctx) {
342                     return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
343                 }});
344 
registerService(LOCATION_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(LOCATION_SERVICE); return new LocationManager(ILocationManager.Stub.asInterface(b)); }})345         registerService(LOCATION_SERVICE, new StaticServiceFetcher() {
346                 public Object createStaticService() {
347                     IBinder b = ServiceManager.getService(LOCATION_SERVICE);
348                     return new LocationManager(ILocationManager.Stub.asInterface(b));
349                 }});
350 
registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() { @Override public Object createService(ContextImpl ctx) { return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface( ServiceManager.getService(NETWORK_POLICY_SERVICE))); } })351         registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
352             @Override
353             public Object createService(ContextImpl ctx) {
354                 return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
355                         ServiceManager.getService(NETWORK_POLICY_SERVICE)));
356             }
357         });
358 
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()); }})359         registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
360                 public Object createService(ContextImpl ctx) {
361                     final Context outerContext = ctx.getOuterContext();
362                     return new NotificationManager(
363                         new ContextThemeWrapper(outerContext,
364                                 Resources.selectSystemTheme(0,
365                                         outerContext.getApplicationInfo().targetSdkVersion,
366                                         com.android.internal.R.style.Theme_Dialog,
367                                         com.android.internal.R.style.Theme_Holo_Dialog,
368                                         com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
369                         ctx.mMainThread.getHandler());
370                 }});
371 
372         // Note: this was previously cached in a static variable, but
373         // constructed using mMainThread.getHandler(), so converting
374         // 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(service, ctx.mMainThread.getHandler()); }})375         registerService(POWER_SERVICE, new ServiceFetcher() {
376                 public Object createService(ContextImpl ctx) {
377                     IBinder b = ServiceManager.getService(POWER_SERVICE);
378                     IPowerManager service = IPowerManager.Stub.asInterface(b);
379                     return new PowerManager(service, ctx.mMainThread.getHandler());
380                 }});
381 
registerService(SEARCH_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new SearchManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})382         registerService(SEARCH_SERVICE, new ServiceFetcher() {
383                 public Object createService(ContextImpl ctx) {
384                     return new SearchManager(ctx.getOuterContext(),
385                             ctx.mMainThread.getHandler());
386                 }});
387 
registerService(SENSOR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new SensorManager(ctx.mMainThread.getHandler().getLooper()); }})388         registerService(SENSOR_SERVICE, new ServiceFetcher() {
389                 public Object createService(ContextImpl ctx) {
390                     return new SensorManager(ctx.mMainThread.getHandler().getLooper());
391                 }});
392 
registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new StatusBarManager(ctx.getOuterContext()); }})393         registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
394                 public Object createService(ContextImpl ctx) {
395                     return new StatusBarManager(ctx.getOuterContext());
396                 }});
397 
registerService(STORAGE_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { try { return new StorageManager(ctx.mMainThread.getHandler().getLooper()); } catch (RemoteException rex) { Log.e(TAG, "Failed to create StorageManager", rex); return null; } }})398         registerService(STORAGE_SERVICE, new ServiceFetcher() {
399                 public Object createService(ContextImpl ctx) {
400                     try {
401                         return new StorageManager(ctx.mMainThread.getHandler().getLooper());
402                     } catch (RemoteException rex) {
403                         Log.e(TAG, "Failed to create StorageManager", rex);
404                         return null;
405                     }
406                 }});
407 
registerService(TELEPHONY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new TelephonyManager(ctx.getOuterContext()); }})408         registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
409                 public Object createService(ContextImpl ctx) {
410                     return new TelephonyManager(ctx.getOuterContext());
411                 }});
412 
registerService(THROTTLE_SERVICE, new StaticServiceFetcher() { public Object createStaticService() { IBinder b = ServiceManager.getService(THROTTLE_SERVICE); return new ThrottleManager(IThrottleManager.Stub.asInterface(b)); }})413         registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
414                 public Object createStaticService() {
415                     IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
416                     return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
417                 }});
418 
registerService(UI_MODE_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new UiModeManager(); }})419         registerService(UI_MODE_SERVICE, new ServiceFetcher() {
420                 public Object createService(ContextImpl ctx) {
421                     return new UiModeManager();
422                 }});
423 
registerService(USB_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(USB_SERVICE); return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); }})424         registerService(USB_SERVICE, new ServiceFetcher() {
425                 public Object createService(ContextImpl ctx) {
426                     IBinder b = ServiceManager.getService(USB_SERVICE);
427                     return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
428                 }});
429 
registerService(VIBRATOR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new Vibrator(); }})430         registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
431                 public Object createService(ContextImpl ctx) {
432                     return new Vibrator();
433                 }});
434 
registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER)435         registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
436 
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(service, ctx.mMainThread.getHandler()); }})437         registerService(WIFI_SERVICE, new ServiceFetcher() {
438                 public Object createService(ContextImpl ctx) {
439                     IBinder b = ServiceManager.getService(WIFI_SERVICE);
440                     IWifiManager service = IWifiManager.Stub.asInterface(b);
441                     return new WifiManager(service, ctx.mMainThread.getHandler());
442                 }});
443 
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); }})444         registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
445                 public Object createService(ContextImpl ctx) {
446                     IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
447                     IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
448                     return new WifiP2pManager(service);
449                 }});
450 
registerService(WINDOW_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return WindowManagerImpl.getDefault(ctx.mPackageInfo.mCompatibilityInfo); }})451         registerService(WINDOW_SERVICE, new ServiceFetcher() {
452                 public Object getService(ContextImpl ctx) {
453                     return WindowManagerImpl.getDefault(ctx.mPackageInfo.mCompatibilityInfo);
454                 }});
455     }
456 
getImpl(Context context)457     static ContextImpl getImpl(Context context) {
458         Context nextContext;
459         while ((context instanceof ContextWrapper) &&
460                 (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
461             context = nextContext;
462         }
463         return (ContextImpl)context;
464     }
465 
466     // The system service cache for the system services that are
467     // cached per-ContextImpl.  Package-scoped to avoid accessor
468     // methods.
469     final ArrayList<Object> mServiceCache = new ArrayList<Object>();
470 
471     @Override
getAssets()472     public AssetManager getAssets() {
473         return mResources.getAssets();
474     }
475 
476     @Override
getResources()477     public Resources getResources() {
478         return mResources;
479     }
480 
481     @Override
getPackageManager()482     public PackageManager getPackageManager() {
483         if (mPackageManager != null) {
484             return mPackageManager;
485         }
486 
487         IPackageManager pm = ActivityThread.getPackageManager();
488         if (pm != null) {
489             // Doesn't matter if we make more than one instance.
490             return (mPackageManager = new ApplicationPackageManager(this, pm));
491         }
492 
493         return null;
494     }
495 
496     @Override
getContentResolver()497     public ContentResolver getContentResolver() {
498         return mContentResolver;
499     }
500 
501     @Override
getMainLooper()502     public Looper getMainLooper() {
503         return mMainThread.getLooper();
504     }
505 
506     @Override
getApplicationContext()507     public Context getApplicationContext() {
508         return (mPackageInfo != null) ?
509                 mPackageInfo.getApplication() : mMainThread.getApplication();
510     }
511 
512     @Override
setTheme(int resid)513     public void setTheme(int resid) {
514         mThemeResource = resid;
515     }
516 
517     @Override
getThemeResId()518     public int getThemeResId() {
519         return mThemeResource;
520     }
521 
522     @Override
getTheme()523     public Resources.Theme getTheme() {
524         if (mTheme == null) {
525             mThemeResource = Resources.selectDefaultTheme(mThemeResource,
526                     getOuterContext().getApplicationInfo().targetSdkVersion);
527             mTheme = mResources.newTheme();
528             mTheme.applyStyle(mThemeResource, true);
529         }
530         return mTheme;
531     }
532 
533     @Override
getClassLoader()534     public ClassLoader getClassLoader() {
535         return mPackageInfo != null ?
536                 mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
537     }
538 
539     @Override
getPackageName()540     public String getPackageName() {
541         if (mPackageInfo != null) {
542             return mPackageInfo.getPackageName();
543         }
544         throw new RuntimeException("Not supported in system context");
545     }
546 
547     @Override
getApplicationInfo()548     public ApplicationInfo getApplicationInfo() {
549         if (mPackageInfo != null) {
550             return mPackageInfo.getApplicationInfo();
551         }
552         throw new RuntimeException("Not supported in system context");
553     }
554 
555     @Override
getPackageResourcePath()556     public String getPackageResourcePath() {
557         if (mPackageInfo != null) {
558             return mPackageInfo.getResDir();
559         }
560         throw new RuntimeException("Not supported in system context");
561     }
562 
563     @Override
getPackageCodePath()564     public String getPackageCodePath() {
565         if (mPackageInfo != null) {
566             return mPackageInfo.getAppDir();
567         }
568         throw new RuntimeException("Not supported in system context");
569     }
570 
getSharedPrefsFile(String name)571     public File getSharedPrefsFile(String name) {
572         return makeFilename(getPreferencesDir(), name + ".xml");
573     }
574 
575     @Override
getSharedPreferences(String name, int mode)576     public SharedPreferences getSharedPreferences(String name, int mode) {
577         SharedPreferencesImpl sp;
578         synchronized (sSharedPrefs) {
579             sp = sSharedPrefs.get(name);
580             if (sp == null) {
581                 File prefsFile = getSharedPrefsFile(name);
582                 sp = new SharedPreferencesImpl(prefsFile, mode);
583                 sSharedPrefs.put(name, sp);
584                 return sp;
585             }
586         }
587         if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
588             getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
589             // If somebody else (some other process) changed the prefs
590             // file behind our back, we reload it.  This has been the
591             // historical (if undocumented) behavior.
592             sp.startReloadIfChangedUnexpectedly();
593         }
594         return sp;
595     }
596 
getPreferencesDir()597     private File getPreferencesDir() {
598         synchronized (mSync) {
599             if (mPreferencesDir == null) {
600                 mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
601             }
602             return mPreferencesDir;
603         }
604     }
605 
606     @Override
openFileInput(String name)607     public FileInputStream openFileInput(String name)
608         throws FileNotFoundException {
609         File f = makeFilename(getFilesDir(), name);
610         return new FileInputStream(f);
611     }
612 
613     @Override
openFileOutput(String name, int mode)614     public FileOutputStream openFileOutput(String name, int mode)
615         throws FileNotFoundException {
616         final boolean append = (mode&MODE_APPEND) != 0;
617         File f = makeFilename(getFilesDir(), name);
618         try {
619             FileOutputStream fos = new FileOutputStream(f, append);
620             setFilePermissionsFromMode(f.getPath(), mode, 0);
621             return fos;
622         } catch (FileNotFoundException e) {
623         }
624 
625         File parent = f.getParentFile();
626         parent.mkdir();
627         FileUtils.setPermissions(
628             parent.getPath(),
629             FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
630             -1, -1);
631         FileOutputStream fos = new FileOutputStream(f, append);
632         setFilePermissionsFromMode(f.getPath(), mode, 0);
633         return fos;
634     }
635 
636     @Override
deleteFile(String name)637     public boolean deleteFile(String name) {
638         File f = makeFilename(getFilesDir(), name);
639         return f.delete();
640     }
641 
642     @Override
getFilesDir()643     public File getFilesDir() {
644         synchronized (mSync) {
645             if (mFilesDir == null) {
646                 mFilesDir = new File(getDataDirFile(), "files");
647             }
648             if (!mFilesDir.exists()) {
649                 if(!mFilesDir.mkdirs()) {
650                     Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
651                     return null;
652                 }
653                 FileUtils.setPermissions(
654                         mFilesDir.getPath(),
655                         FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
656                         -1, -1);
657             }
658             return mFilesDir;
659         }
660     }
661 
662     @Override
getExternalFilesDir(String type)663     public File getExternalFilesDir(String type) {
664         synchronized (mSync) {
665             if (mExternalFilesDir == null) {
666                 mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
667                         getPackageName());
668             }
669             if (!mExternalFilesDir.exists()) {
670                 try {
671                     (new File(Environment.getExternalStorageAndroidDataDir(),
672                             ".nomedia")).createNewFile();
673                 } catch (IOException e) {
674                 }
675                 if (!mExternalFilesDir.mkdirs()) {
676                     Log.w(TAG, "Unable to create external files directory");
677                     return null;
678                 }
679             }
680             if (type == null) {
681                 return mExternalFilesDir;
682             }
683             File dir = new File(mExternalFilesDir, type);
684             if (!dir.exists()) {
685                 if (!dir.mkdirs()) {
686                     Log.w(TAG, "Unable to create external media directory " + dir);
687                     return null;
688                 }
689             }
690             return dir;
691         }
692     }
693 
694     @Override
getObbDir()695     public File getObbDir() {
696         synchronized (mSync) {
697             if (mObbDir == null) {
698                 mObbDir = Environment.getExternalStorageAppObbDirectory(
699                         getPackageName());
700             }
701             return mObbDir;
702         }
703     }
704 
705     @Override
getCacheDir()706     public File getCacheDir() {
707         synchronized (mSync) {
708             if (mCacheDir == null) {
709                 mCacheDir = new File(getDataDirFile(), "cache");
710             }
711             if (!mCacheDir.exists()) {
712                 if(!mCacheDir.mkdirs()) {
713                     Log.w(TAG, "Unable to create cache directory");
714                     return null;
715                 }
716                 FileUtils.setPermissions(
717                         mCacheDir.getPath(),
718                         FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
719                         -1, -1);
720             }
721         }
722         return mCacheDir;
723     }
724 
725     @Override
getExternalCacheDir()726     public File getExternalCacheDir() {
727         synchronized (mSync) {
728             if (mExternalCacheDir == null) {
729                 mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
730                         getPackageName());
731             }
732             if (!mExternalCacheDir.exists()) {
733                 try {
734                     (new File(Environment.getExternalStorageAndroidDataDir(),
735                             ".nomedia")).createNewFile();
736                 } catch (IOException e) {
737                 }
738                 if (!mExternalCacheDir.mkdirs()) {
739                     Log.w(TAG, "Unable to create external cache directory");
740                     return null;
741                 }
742             }
743             return mExternalCacheDir;
744         }
745     }
746 
747     @Override
getFileStreamPath(String name)748     public File getFileStreamPath(String name) {
749         return makeFilename(getFilesDir(), name);
750     }
751 
752     @Override
fileList()753     public String[] fileList() {
754         final String[] list = getFilesDir().list();
755         return (list != null) ? list : EMPTY_FILE_LIST;
756     }
757 
758     @Override
openOrCreateDatabase(String name, int mode, CursorFactory factory)759     public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
760         File f = validateFilePath(name, true);
761         SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
762         setFilePermissionsFromMode(f.getPath(), mode, 0);
763         return db;
764     }
765 
766     @Override
openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler)767     public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
768             DatabaseErrorHandler errorHandler) {
769         File f = validateFilePath(name, true);
770         SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler);
771         setFilePermissionsFromMode(f.getPath(), mode, 0);
772         return db;
773     }
774 
775     @Override
deleteDatabase(String name)776     public boolean deleteDatabase(String name) {
777         try {
778             File f = validateFilePath(name, false);
779             return f.delete();
780         } catch (Exception e) {
781         }
782         return false;
783     }
784 
785     @Override
getDatabasePath(String name)786     public File getDatabasePath(String name) {
787         return validateFilePath(name, false);
788     }
789 
790     @Override
databaseList()791     public String[] databaseList() {
792         final String[] list = getDatabasesDir().list();
793         return (list != null) ? list : EMPTY_FILE_LIST;
794     }
795 
796 
getDatabasesDir()797     private File getDatabasesDir() {
798         synchronized (mSync) {
799             if (mDatabasesDir == null) {
800                 mDatabasesDir = new File(getDataDirFile(), "databases");
801             }
802             if (mDatabasesDir.getPath().equals("databases")) {
803                 mDatabasesDir = new File("/data/system");
804             }
805             return mDatabasesDir;
806         }
807     }
808 
809     @Override
getWallpaper()810     public Drawable getWallpaper() {
811         return getWallpaperManager().getDrawable();
812     }
813 
814     @Override
peekWallpaper()815     public Drawable peekWallpaper() {
816         return getWallpaperManager().peekDrawable();
817     }
818 
819     @Override
getWallpaperDesiredMinimumWidth()820     public int getWallpaperDesiredMinimumWidth() {
821         return getWallpaperManager().getDesiredMinimumWidth();
822     }
823 
824     @Override
getWallpaperDesiredMinimumHeight()825     public int getWallpaperDesiredMinimumHeight() {
826         return getWallpaperManager().getDesiredMinimumHeight();
827     }
828 
829     @Override
setWallpaper(Bitmap bitmap)830     public void setWallpaper(Bitmap bitmap) throws IOException  {
831         getWallpaperManager().setBitmap(bitmap);
832     }
833 
834     @Override
setWallpaper(InputStream data)835     public void setWallpaper(InputStream data) throws IOException {
836         getWallpaperManager().setStream(data);
837     }
838 
839     @Override
clearWallpaper()840     public void clearWallpaper() throws IOException {
841         getWallpaperManager().clear();
842     }
843 
844     @Override
startActivity(Intent intent)845     public void startActivity(Intent intent) {
846         if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
847             throw new AndroidRuntimeException(
848                     "Calling startActivity() from outside of an Activity "
849                     + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
850                     + " Is this really what you want?");
851         }
852         mMainThread.getInstrumentation().execStartActivity(
853             getOuterContext(), mMainThread.getApplicationThread(), null,
854             (Activity)null, intent, -1);
855     }
856 
857     @Override
startActivities(Intent[] intents)858     public void startActivities(Intent[] intents) {
859         if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
860             throw new AndroidRuntimeException(
861                     "Calling startActivities() from outside of an Activity "
862                     + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
863                     + " Is this really what you want?");
864         }
865         mMainThread.getInstrumentation().execStartActivities(
866             getOuterContext(), mMainThread.getApplicationThread(), null,
867             (Activity)null, intents);
868     }
869 
870     @Override
startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)871     public void startIntentSender(IntentSender intent,
872             Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
873             throws IntentSender.SendIntentException {
874         try {
875             String resolvedType = null;
876             if (fillInIntent != null) {
877                 fillInIntent.setAllowFds(false);
878                 resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
879             }
880             int result = ActivityManagerNative.getDefault()
881                 .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
882                         fillInIntent, resolvedType, null, null,
883                         0, flagsMask, flagsValues);
884             if (result == IActivityManager.START_CANCELED) {
885                 throw new IntentSender.SendIntentException();
886             }
887             Instrumentation.checkStartActivityResult(result, null);
888         } catch (RemoteException e) {
889         }
890     }
891 
892     @Override
sendBroadcast(Intent intent)893     public void sendBroadcast(Intent intent) {
894         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
895         try {
896             intent.setAllowFds(false);
897             ActivityManagerNative.getDefault().broadcastIntent(
898                 mMainThread.getApplicationThread(), intent, resolvedType, null,
899                 Activity.RESULT_OK, null, null, null, false, false);
900         } catch (RemoteException e) {
901         }
902     }
903 
904     @Override
sendBroadcast(Intent intent, String receiverPermission)905     public void sendBroadcast(Intent intent, String receiverPermission) {
906         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
907         try {
908             intent.setAllowFds(false);
909             ActivityManagerNative.getDefault().broadcastIntent(
910                 mMainThread.getApplicationThread(), intent, resolvedType, null,
911                 Activity.RESULT_OK, null, null, receiverPermission, false, false);
912         } catch (RemoteException e) {
913         }
914     }
915 
916     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)917     public void sendOrderedBroadcast(Intent intent,
918             String receiverPermission) {
919         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
920         try {
921             intent.setAllowFds(false);
922             ActivityManagerNative.getDefault().broadcastIntent(
923                 mMainThread.getApplicationThread(), intent, resolvedType, null,
924                 Activity.RESULT_OK, null, null, receiverPermission, true, false);
925         } catch (RemoteException e) {
926         }
927     }
928 
929     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)930     public void sendOrderedBroadcast(Intent intent,
931             String receiverPermission, BroadcastReceiver resultReceiver,
932             Handler scheduler, int initialCode, String initialData,
933             Bundle initialExtras) {
934         IIntentReceiver rd = null;
935         if (resultReceiver != null) {
936             if (mPackageInfo != null) {
937                 if (scheduler == null) {
938                     scheduler = mMainThread.getHandler();
939                 }
940                 rd = mPackageInfo.getReceiverDispatcher(
941                     resultReceiver, getOuterContext(), scheduler,
942                     mMainThread.getInstrumentation(), false);
943             } else {
944                 if (scheduler == null) {
945                     scheduler = mMainThread.getHandler();
946                 }
947                 rd = new LoadedApk.ReceiverDispatcher(
948                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
949             }
950         }
951         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
952         try {
953             intent.setAllowFds(false);
954             ActivityManagerNative.getDefault().broadcastIntent(
955                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
956                 initialCode, initialData, initialExtras, receiverPermission,
957                 true, false);
958         } catch (RemoteException e) {
959         }
960     }
961 
962     @Override
sendStickyBroadcast(Intent intent)963     public void sendStickyBroadcast(Intent intent) {
964         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
965         try {
966             intent.setAllowFds(false);
967             ActivityManagerNative.getDefault().broadcastIntent(
968                 mMainThread.getApplicationThread(), intent, resolvedType, null,
969                 Activity.RESULT_OK, null, null, null, false, true);
970         } catch (RemoteException e) {
971         }
972     }
973 
974     @Override
sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)975     public void sendStickyOrderedBroadcast(Intent intent,
976             BroadcastReceiver resultReceiver,
977             Handler scheduler, int initialCode, String initialData,
978             Bundle initialExtras) {
979         IIntentReceiver rd = null;
980         if (resultReceiver != null) {
981             if (mPackageInfo != null) {
982                 if (scheduler == null) {
983                     scheduler = mMainThread.getHandler();
984                 }
985                 rd = mPackageInfo.getReceiverDispatcher(
986                     resultReceiver, getOuterContext(), scheduler,
987                     mMainThread.getInstrumentation(), false);
988             } else {
989                 if (scheduler == null) {
990                     scheduler = mMainThread.getHandler();
991                 }
992                 rd = new LoadedApk.ReceiverDispatcher(
993                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
994             }
995         }
996         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
997         try {
998             intent.setAllowFds(false);
999             ActivityManagerNative.getDefault().broadcastIntent(
1000                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1001                 initialCode, initialData, initialExtras, null,
1002                 true, true);
1003         } catch (RemoteException e) {
1004         }
1005     }
1006 
1007     @Override
removeStickyBroadcast(Intent intent)1008     public void removeStickyBroadcast(Intent intent) {
1009         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1010         if (resolvedType != null) {
1011             intent = new Intent(intent);
1012             intent.setDataAndType(intent.getData(), resolvedType);
1013         }
1014         try {
1015             intent.setAllowFds(false);
1016             ActivityManagerNative.getDefault().unbroadcastIntent(
1017                 mMainThread.getApplicationThread(), intent);
1018         } catch (RemoteException e) {
1019         }
1020     }
1021 
1022     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)1023     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1024         return registerReceiver(receiver, filter, null, null);
1025     }
1026 
1027     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)1028     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1029             String broadcastPermission, Handler scheduler) {
1030         return registerReceiverInternal(receiver, filter, broadcastPermission,
1031                 scheduler, getOuterContext());
1032     }
1033 
registerReceiverInternal(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, Context context)1034     private Intent registerReceiverInternal(BroadcastReceiver receiver,
1035             IntentFilter filter, String broadcastPermission,
1036             Handler scheduler, Context context) {
1037         IIntentReceiver rd = null;
1038         if (receiver != null) {
1039             if (mPackageInfo != null && context != null) {
1040                 if (scheduler == null) {
1041                     scheduler = mMainThread.getHandler();
1042                 }
1043                 rd = mPackageInfo.getReceiverDispatcher(
1044                     receiver, context, scheduler,
1045                     mMainThread.getInstrumentation(), true);
1046             } else {
1047                 if (scheduler == null) {
1048                     scheduler = mMainThread.getHandler();
1049                 }
1050                 rd = new LoadedApk.ReceiverDispatcher(
1051                         receiver, context, scheduler, null, true).getIIntentReceiver();
1052             }
1053         }
1054         try {
1055             return ActivityManagerNative.getDefault().registerReceiver(
1056                     mMainThread.getApplicationThread(), mBasePackageName,
1057                     rd, filter, broadcastPermission);
1058         } catch (RemoteException e) {
1059             return null;
1060         }
1061     }
1062 
1063     @Override
unregisterReceiver(BroadcastReceiver receiver)1064     public void unregisterReceiver(BroadcastReceiver receiver) {
1065         if (mPackageInfo != null) {
1066             IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
1067                     getOuterContext(), receiver);
1068             try {
1069                 ActivityManagerNative.getDefault().unregisterReceiver(rd);
1070             } catch (RemoteException e) {
1071             }
1072         } else {
1073             throw new RuntimeException("Not supported in system context");
1074         }
1075     }
1076 
1077     @Override
startService(Intent service)1078     public ComponentName startService(Intent service) {
1079         try {
1080             service.setAllowFds(false);
1081             ComponentName cn = ActivityManagerNative.getDefault().startService(
1082                 mMainThread.getApplicationThread(), service,
1083                 service.resolveTypeIfNeeded(getContentResolver()));
1084             if (cn != null && cn.getPackageName().equals("!")) {
1085                 throw new SecurityException(
1086                         "Not allowed to start service " + service
1087                         + " without permission " + cn.getClassName());
1088             }
1089             return cn;
1090         } catch (RemoteException e) {
1091             return null;
1092         }
1093     }
1094 
1095     @Override
stopService(Intent service)1096     public boolean stopService(Intent service) {
1097         try {
1098             service.setAllowFds(false);
1099             int res = ActivityManagerNative.getDefault().stopService(
1100                 mMainThread.getApplicationThread(), service,
1101                 service.resolveTypeIfNeeded(getContentResolver()));
1102             if (res < 0) {
1103                 throw new SecurityException(
1104                         "Not allowed to stop service " + service);
1105             }
1106             return res != 0;
1107         } catch (RemoteException e) {
1108             return false;
1109         }
1110     }
1111 
1112     @Override
bindService(Intent service, ServiceConnection conn, int flags)1113     public boolean bindService(Intent service, ServiceConnection conn,
1114             int flags) {
1115         IServiceConnection sd;
1116         if (mPackageInfo != null) {
1117             sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
1118                     mMainThread.getHandler(), flags);
1119         } else {
1120             throw new RuntimeException("Not supported in system context");
1121         }
1122         try {
1123             IBinder token = getActivityToken();
1124             if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1125                     && mPackageInfo.getApplicationInfo().targetSdkVersion
1126                     < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1127                 flags |= BIND_WAIVE_PRIORITY;
1128             }
1129             service.setAllowFds(false);
1130             int res = ActivityManagerNative.getDefault().bindService(
1131                 mMainThread.getApplicationThread(), getActivityToken(),
1132                 service, service.resolveTypeIfNeeded(getContentResolver()),
1133                 sd, flags);
1134             if (res < 0) {
1135                 throw new SecurityException(
1136                         "Not allowed to bind to service " + service);
1137             }
1138             return res != 0;
1139         } catch (RemoteException e) {
1140             return false;
1141         }
1142     }
1143 
1144     @Override
unbindService(ServiceConnection conn)1145     public void unbindService(ServiceConnection conn) {
1146         if (mPackageInfo != null) {
1147             IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
1148                     getOuterContext(), conn);
1149             try {
1150                 ActivityManagerNative.getDefault().unbindService(sd);
1151             } catch (RemoteException e) {
1152             }
1153         } else {
1154             throw new RuntimeException("Not supported in system context");
1155         }
1156     }
1157 
1158     @Override
startInstrumentation(ComponentName className, String profileFile, Bundle arguments)1159     public boolean startInstrumentation(ComponentName className,
1160             String profileFile, Bundle arguments) {
1161         try {
1162             if (arguments != null) {
1163                 arguments.setAllowFds(false);
1164             }
1165             return ActivityManagerNative.getDefault().startInstrumentation(
1166                     className, profileFile, 0, arguments, null);
1167         } catch (RemoteException e) {
1168             // System has crashed, nothing we can do.
1169         }
1170         return false;
1171     }
1172 
1173     @Override
getSystemService(String name)1174     public Object getSystemService(String name) {
1175         ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1176         return fetcher == null ? null : fetcher.getService(this);
1177     }
1178 
getWallpaperManager()1179     private WallpaperManager getWallpaperManager() {
1180         return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
1181     }
1182 
createDropBoxManager()1183     /* package */ static DropBoxManager createDropBoxManager() {
1184         IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1185         IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1186         if (service == null) {
1187             // Don't return a DropBoxManager that will NPE upon use.
1188             // This also avoids caching a broken DropBoxManager in
1189             // getDropBoxManager during early boot, before the
1190             // DROPBOX_SERVICE is registered.
1191             return null;
1192         }
1193         return new DropBoxManager(service);
1194     }
1195 
1196     @Override
checkPermission(String permission, int pid, int uid)1197     public int checkPermission(String permission, int pid, int uid) {
1198         if (permission == null) {
1199             throw new IllegalArgumentException("permission is null");
1200         }
1201 
1202         try {
1203             return ActivityManagerNative.getDefault().checkPermission(
1204                     permission, pid, uid);
1205         } catch (RemoteException e) {
1206             return PackageManager.PERMISSION_DENIED;
1207         }
1208     }
1209 
1210     @Override
checkCallingPermission(String permission)1211     public int checkCallingPermission(String permission) {
1212         if (permission == null) {
1213             throw new IllegalArgumentException("permission is null");
1214         }
1215 
1216         int pid = Binder.getCallingPid();
1217         if (pid != Process.myPid()) {
1218             return checkPermission(permission, pid,
1219                     Binder.getCallingUid());
1220         }
1221         return PackageManager.PERMISSION_DENIED;
1222     }
1223 
1224     @Override
checkCallingOrSelfPermission(String permission)1225     public int checkCallingOrSelfPermission(String permission) {
1226         if (permission == null) {
1227             throw new IllegalArgumentException("permission is null");
1228         }
1229 
1230         return checkPermission(permission, Binder.getCallingPid(),
1231                 Binder.getCallingUid());
1232     }
1233 
enforce( String permission, int resultOfCheck, boolean selfToo, int uid, String message)1234     private void enforce(
1235             String permission, int resultOfCheck,
1236             boolean selfToo, int uid, String message) {
1237         if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1238             throw new SecurityException(
1239                     (message != null ? (message + ": ") : "") +
1240                     (selfToo
1241                      ? "Neither user " + uid + " nor current process has "
1242                      : "User " + uid + " does not have ") +
1243                     permission +
1244                     ".");
1245         }
1246     }
1247 
enforcePermission( String permission, int pid, int uid, String message)1248     public void enforcePermission(
1249             String permission, int pid, int uid, String message) {
1250         enforce(permission,
1251                 checkPermission(permission, pid, uid),
1252                 false,
1253                 uid,
1254                 message);
1255     }
1256 
enforceCallingPermission(String permission, String message)1257     public void enforceCallingPermission(String permission, String message) {
1258         enforce(permission,
1259                 checkCallingPermission(permission),
1260                 false,
1261                 Binder.getCallingUid(),
1262                 message);
1263     }
1264 
enforceCallingOrSelfPermission( String permission, String message)1265     public void enforceCallingOrSelfPermission(
1266             String permission, String message) {
1267         enforce(permission,
1268                 checkCallingOrSelfPermission(permission),
1269                 true,
1270                 Binder.getCallingUid(),
1271                 message);
1272     }
1273 
1274     @Override
grantUriPermission(String toPackage, Uri uri, int modeFlags)1275     public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
1276          try {
1277             ActivityManagerNative.getDefault().grantUriPermission(
1278                     mMainThread.getApplicationThread(), toPackage, uri,
1279                     modeFlags);
1280         } catch (RemoteException e) {
1281         }
1282     }
1283 
1284     @Override
revokeUriPermission(Uri uri, int modeFlags)1285     public void revokeUriPermission(Uri uri, int modeFlags) {
1286          try {
1287             ActivityManagerNative.getDefault().revokeUriPermission(
1288                     mMainThread.getApplicationThread(), uri,
1289                     modeFlags);
1290         } catch (RemoteException e) {
1291         }
1292     }
1293 
1294     @Override
checkUriPermission(Uri uri, int pid, int uid, int modeFlags)1295     public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
1296         try {
1297             return ActivityManagerNative.getDefault().checkUriPermission(
1298                     uri, pid, uid, modeFlags);
1299         } catch (RemoteException e) {
1300             return PackageManager.PERMISSION_DENIED;
1301         }
1302     }
1303 
1304     @Override
checkCallingUriPermission(Uri uri, int modeFlags)1305     public int checkCallingUriPermission(Uri uri, int modeFlags) {
1306         int pid = Binder.getCallingPid();
1307         if (pid != Process.myPid()) {
1308             return checkUriPermission(uri, pid,
1309                     Binder.getCallingUid(), modeFlags);
1310         }
1311         return PackageManager.PERMISSION_DENIED;
1312     }
1313 
1314     @Override
checkCallingOrSelfUriPermission(Uri uri, int modeFlags)1315     public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
1316         return checkUriPermission(uri, Binder.getCallingPid(),
1317                 Binder.getCallingUid(), modeFlags);
1318     }
1319 
1320     @Override
checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags)1321     public int checkUriPermission(Uri uri, String readPermission,
1322             String writePermission, int pid, int uid, int modeFlags) {
1323         if (DEBUG) {
1324             Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
1325                     + readPermission + " writePermission=" + writePermission
1326                     + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
1327         }
1328         if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
1329             if (readPermission == null
1330                     || checkPermission(readPermission, pid, uid)
1331                     == PackageManager.PERMISSION_GRANTED) {
1332                 return PackageManager.PERMISSION_GRANTED;
1333             }
1334         }
1335         if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
1336             if (writePermission == null
1337                     || checkPermission(writePermission, pid, uid)
1338                     == PackageManager.PERMISSION_GRANTED) {
1339                 return PackageManager.PERMISSION_GRANTED;
1340             }
1341         }
1342         return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
1343                 : PackageManager.PERMISSION_DENIED;
1344     }
1345 
uriModeFlagToString(int uriModeFlags)1346     private String uriModeFlagToString(int uriModeFlags) {
1347         switch (uriModeFlags) {
1348             case Intent.FLAG_GRANT_READ_URI_PERMISSION |
1349                     Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
1350                 return "read and write";
1351             case Intent.FLAG_GRANT_READ_URI_PERMISSION:
1352                 return "read";
1353             case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
1354                 return "write";
1355         }
1356         throw new IllegalArgumentException(
1357                 "Unknown permission mode flags: " + uriModeFlags);
1358     }
1359 
enforceForUri( int modeFlags, int resultOfCheck, boolean selfToo, int uid, Uri uri, String message)1360     private void enforceForUri(
1361             int modeFlags, int resultOfCheck, boolean selfToo,
1362             int uid, Uri uri, String message) {
1363         if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1364             throw new SecurityException(
1365                     (message != null ? (message + ": ") : "") +
1366                     (selfToo
1367                      ? "Neither user " + uid + " nor current process has "
1368                      : "User " + uid + " does not have ") +
1369                     uriModeFlagToString(modeFlags) +
1370                     " permission on " +
1371                     uri +
1372                     ".");
1373         }
1374     }
1375 
enforceUriPermission( Uri uri, int pid, int uid, int modeFlags, String message)1376     public void enforceUriPermission(
1377             Uri uri, int pid, int uid, int modeFlags, String message) {
1378         enforceForUri(
1379                 modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
1380                 false, uid, uri, message);
1381     }
1382 
enforceCallingUriPermission( Uri uri, int modeFlags, String message)1383     public void enforceCallingUriPermission(
1384             Uri uri, int modeFlags, String message) {
1385         enforceForUri(
1386                 modeFlags, checkCallingUriPermission(uri, modeFlags),
1387                 false, Binder.getCallingUid(), uri, message);
1388     }
1389 
enforceCallingOrSelfUriPermission( Uri uri, int modeFlags, String message)1390     public void enforceCallingOrSelfUriPermission(
1391             Uri uri, int modeFlags, String message) {
1392         enforceForUri(
1393                 modeFlags,
1394                 checkCallingOrSelfUriPermission(uri, modeFlags), true,
1395                 Binder.getCallingUid(), uri, message);
1396     }
1397 
enforceUriPermission( Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message)1398     public void enforceUriPermission(
1399             Uri uri, String readPermission, String writePermission,
1400             int pid, int uid, int modeFlags, String message) {
1401         enforceForUri(modeFlags,
1402                       checkUriPermission(
1403                               uri, readPermission, writePermission, pid, uid,
1404                               modeFlags),
1405                       false,
1406                       uid,
1407                       uri,
1408                       message);
1409     }
1410 
1411     @Override
createPackageContext(String packageName, int flags)1412     public Context createPackageContext(String packageName, int flags)
1413         throws PackageManager.NameNotFoundException {
1414         if (packageName.equals("system") || packageName.equals("android")) {
1415             return new ContextImpl(mMainThread.getSystemContext());
1416         }
1417 
1418         LoadedApk pi =
1419             mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);
1420         if (pi != null) {
1421             ContextImpl c = new ContextImpl();
1422             c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1423             c.init(pi, null, mMainThread, mResources, mBasePackageName);
1424             if (c.mResources != null) {
1425                 return c;
1426             }
1427         }
1428 
1429         // Should be a better exception.
1430         throw new PackageManager.NameNotFoundException(
1431             "Application package " + packageName + " not found");
1432     }
1433 
1434     @Override
isRestricted()1435     public boolean isRestricted() {
1436         return mRestricted;
1437     }
1438 
getDataDirFile()1439     private File getDataDirFile() {
1440         if (mPackageInfo != null) {
1441             return mPackageInfo.getDataDirFile();
1442         }
1443         throw new RuntimeException("Not supported in system context");
1444     }
1445 
1446     @Override
getDir(String name, int mode)1447     public File getDir(String name, int mode) {
1448         name = "app_" + name;
1449         File file = makeFilename(getDataDirFile(), name);
1450         if (!file.exists()) {
1451             file.mkdir();
1452             setFilePermissionsFromMode(file.getPath(), mode,
1453                     FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
1454         }
1455         return file;
1456     }
1457 
createSystemContext(ActivityThread mainThread)1458     static ContextImpl createSystemContext(ActivityThread mainThread) {
1459         ContextImpl context = new ContextImpl();
1460         context.init(Resources.getSystem(), mainThread);
1461         return context;
1462     }
1463 
ContextImpl()1464     ContextImpl() {
1465         mOuterContext = this;
1466     }
1467 
1468     /**
1469      * Create a new ApplicationContext from an existing one.  The new one
1470      * works and operates the same as the one it is copying.
1471      *
1472      * @param context Existing application context.
1473      */
ContextImpl(ContextImpl context)1474     public ContextImpl(ContextImpl context) {
1475         mPackageInfo = context.mPackageInfo;
1476         mBasePackageName = context.mBasePackageName;
1477         mResources = context.mResources;
1478         mMainThread = context.mMainThread;
1479         mContentResolver = context.mContentResolver;
1480         mOuterContext = this;
1481     }
1482 
init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread)1483     final void init(LoadedApk packageInfo,
1484             IBinder activityToken, ActivityThread mainThread) {
1485         init(packageInfo, activityToken, mainThread, null, null);
1486     }
1487 
init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, Resources container, String basePackageName)1488     final void init(LoadedApk packageInfo,
1489                 IBinder activityToken, ActivityThread mainThread,
1490                 Resources container, String basePackageName) {
1491         mPackageInfo = packageInfo;
1492         mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
1493         mResources = mPackageInfo.getResources(mainThread);
1494 
1495         if (mResources != null && container != null
1496                 && container.getCompatibilityInfo().applicationScale !=
1497                         mResources.getCompatibilityInfo().applicationScale) {
1498             if (DEBUG) {
1499                 Log.d(TAG, "loaded context has different scaling. Using container's" +
1500                         " compatiblity info:" + container.getDisplayMetrics());
1501             }
1502             mResources = mainThread.getTopLevelResources(
1503                     mPackageInfo.getResDir(), container.getCompatibilityInfo());
1504         }
1505         mMainThread = mainThread;
1506         mContentResolver = new ApplicationContentResolver(this, mainThread);
1507 
1508         setActivityToken(activityToken);
1509     }
1510 
init(Resources resources, ActivityThread mainThread)1511     final void init(Resources resources, ActivityThread mainThread) {
1512         mPackageInfo = null;
1513         mBasePackageName = null;
1514         mResources = resources;
1515         mMainThread = mainThread;
1516         mContentResolver = new ApplicationContentResolver(this, mainThread);
1517     }
1518 
scheduleFinalCleanup(String who, String what)1519     final void scheduleFinalCleanup(String who, String what) {
1520         mMainThread.scheduleContextCleanup(this, who, what);
1521     }
1522 
performFinalCleanup(String who, String what)1523     final void performFinalCleanup(String who, String what) {
1524         //Log.i(TAG, "Cleanup up context: " + this);
1525         mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
1526     }
1527 
getReceiverRestrictedContext()1528     final Context getReceiverRestrictedContext() {
1529         if (mReceiverRestrictedContext != null) {
1530             return mReceiverRestrictedContext;
1531         }
1532         return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
1533     }
1534 
setActivityToken(IBinder token)1535     final void setActivityToken(IBinder token) {
1536         mActivityToken = token;
1537     }
1538 
setOuterContext(Context context)1539     final void setOuterContext(Context context) {
1540         mOuterContext = context;
1541     }
1542 
getOuterContext()1543     final Context getOuterContext() {
1544         return mOuterContext;
1545     }
1546 
getActivityToken()1547     final IBinder getActivityToken() {
1548         return mActivityToken;
1549     }
1550 
setFilePermissionsFromMode(String name, int mode, int extraPermissions)1551     static void setFilePermissionsFromMode(String name, int mode,
1552             int extraPermissions) {
1553         int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
1554             |FileUtils.S_IRGRP|FileUtils.S_IWGRP
1555             |extraPermissions;
1556         if ((mode&MODE_WORLD_READABLE) != 0) {
1557             perms |= FileUtils.S_IROTH;
1558         }
1559         if ((mode&MODE_WORLD_WRITEABLE) != 0) {
1560             perms |= FileUtils.S_IWOTH;
1561         }
1562         if (DEBUG) {
1563             Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
1564                   + ", perms=0x" + Integer.toHexString(perms));
1565         }
1566         FileUtils.setPermissions(name, perms, -1, -1);
1567     }
1568 
validateFilePath(String name, boolean createDirectory)1569     private File validateFilePath(String name, boolean createDirectory) {
1570         File dir;
1571         File f;
1572 
1573         if (name.charAt(0) == File.separatorChar) {
1574             String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1575             dir = new File(dirPath);
1576             name = name.substring(name.lastIndexOf(File.separatorChar));
1577             f = new File(dir, name);
1578         } else {
1579             dir = getDatabasesDir();
1580             f = makeFilename(dir, name);
1581         }
1582 
1583         if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1584             FileUtils.setPermissions(dir.getPath(),
1585                 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1586                 -1, -1);
1587         }
1588 
1589         return f;
1590     }
1591 
makeFilename(File base, String name)1592     private File makeFilename(File base, String name) {
1593         if (name.indexOf(File.separatorChar) < 0) {
1594             return new File(base, name);
1595         }
1596         throw new IllegalArgumentException(
1597                 "File " + name + " contains a path separator");
1598     }
1599 
1600     // ----------------------------------------------------------------------
1601     // ----------------------------------------------------------------------
1602     // ----------------------------------------------------------------------
1603 
1604     private static final class ApplicationContentResolver extends ContentResolver {
ApplicationContentResolver(Context context, ActivityThread mainThread)1605         public ApplicationContentResolver(Context context, ActivityThread mainThread) {
1606             super(context);
1607             mMainThread = mainThread;
1608         }
1609 
1610         @Override
acquireProvider(Context context, String name)1611         protected IContentProvider acquireProvider(Context context, String name) {
1612             return mMainThread.acquireProvider(context, name);
1613         }
1614 
1615         @Override
acquireExistingProvider(Context context, String name)1616         protected IContentProvider acquireExistingProvider(Context context, String name) {
1617             return mMainThread.acquireExistingProvider(context, name);
1618         }
1619 
1620         @Override
releaseProvider(IContentProvider provider)1621         public boolean releaseProvider(IContentProvider provider) {
1622             return mMainThread.releaseProvider(provider);
1623         }
1624 
1625         private final ActivityThread mMainThread;
1626     }
1627 }
1628