• 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 android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.content.BroadcastReceiver;
22 import android.content.ComponentName;
23 import android.content.ContentProvider;
24 import android.content.ContentResolver;
25 import android.content.Context;
26 import android.content.ContextWrapper;
27 import android.content.IContentProvider;
28 import android.content.IIntentReceiver;
29 import android.content.Intent;
30 import android.content.IntentFilter;
31 import android.content.IntentSender;
32 import android.content.ReceiverCallNotAllowedException;
33 import android.content.ServiceConnection;
34 import android.content.SharedPreferences;
35 import android.content.pm.ActivityInfo;
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.net.Uri;
50 import android.os.Binder;
51 import android.os.Build;
52 import android.os.Bundle;
53 import android.os.Debug;
54 import android.os.Environment;
55 import android.os.FileUtils;
56 import android.os.Handler;
57 import android.os.IBinder;
58 import android.os.Looper;
59 import android.os.Process;
60 import android.os.RemoteException;
61 import android.os.ServiceManager;
62 import android.os.UserHandle;
63 import android.os.storage.IMountService;
64 import android.system.ErrnoException;
65 import android.system.Os;
66 import android.system.OsConstants;
67 import android.util.AndroidRuntimeException;
68 import android.util.ArrayMap;
69 import android.util.Log;
70 import android.util.Slog;
71 import android.view.Display;
72 import android.view.DisplayAdjustments;
73 
74 import com.android.internal.annotations.GuardedBy;
75 import com.android.internal.util.Preconditions;
76 
77 import java.io.File;
78 import java.io.FileInputStream;
79 import java.io.FileNotFoundException;
80 import java.io.FileOutputStream;
81 import java.io.FilenameFilter;
82 import java.io.IOException;
83 import java.io.InputStream;
84 import java.util.Objects;
85 
86 class ReceiverRestrictedContext extends ContextWrapper {
ReceiverRestrictedContext(Context base)87     ReceiverRestrictedContext(Context base) {
88         super(base);
89     }
90 
91     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)92     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
93         return registerReceiver(receiver, filter, null, null);
94     }
95 
96     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)97     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
98             String broadcastPermission, Handler scheduler) {
99         if (receiver == null) {
100             // Allow retrieving current sticky broadcast; this is safe since we
101             // aren't actually registering a receiver.
102             return super.registerReceiver(null, filter, broadcastPermission, scheduler);
103         } else {
104             throw new ReceiverCallNotAllowedException(
105                     "BroadcastReceiver components are not allowed to register to receive intents");
106         }
107     }
108 
109     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)110     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
111             IntentFilter filter, String broadcastPermission, Handler scheduler) {
112         if (receiver == null) {
113             // Allow retrieving current sticky broadcast; this is safe since we
114             // aren't actually registering a receiver.
115             return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler);
116         } else {
117             throw new ReceiverCallNotAllowedException(
118                     "BroadcastReceiver components are not allowed to register to receive intents");
119         }
120     }
121 
122     @Override
bindService(Intent service, ServiceConnection conn, int flags)123     public boolean bindService(Intent service, ServiceConnection conn, int flags) {
124         throw new ReceiverCallNotAllowedException(
125                 "BroadcastReceiver components are not allowed to bind to services");
126     }
127 }
128 
129 /**
130  * Common implementation of Context API, which provides the base
131  * context object for Activity and other application components.
132  */
133 class ContextImpl extends Context {
134     private final static String TAG = "ContextImpl";
135     private final static boolean DEBUG = false;
136 
137     /**
138      * Map from package name, to preference name, to cached preferences.
139      */
140     @GuardedBy("ContextImpl.class")
141     private static ArrayMap<String, ArrayMap<File, SharedPreferencesImpl>> sSharedPrefsCache;
142 
143     /**
144      * Map from preference name to generated path.
145      */
146     @GuardedBy("ContextImpl.class")
147     private ArrayMap<String, File> mSharedPrefsPaths;
148 
149     final ActivityThread mMainThread;
150     final LoadedApk mPackageInfo;
151 
152     private final IBinder mActivityToken;
153 
154     private final UserHandle mUser;
155 
156     private final ApplicationContentResolver mContentResolver;
157 
158     private final String mBasePackageName;
159     private final String mOpPackageName;
160 
161     private final @NonNull ResourcesManager mResourcesManager;
162     private final @NonNull Resources mResources;
163     private @Nullable Display mDisplay; // may be null if default display
164 
165     private final int mFlags;
166 
167     private Context mOuterContext;
168     private int mThemeResource = 0;
169     private Resources.Theme mTheme = null;
170     private PackageManager mPackageManager;
171     private Context mReceiverRestrictedContext = null;
172 
173     private final Object mSync = new Object();
174 
175     @GuardedBy("mSync")
176     private File mDatabasesDir;
177     @GuardedBy("mSync")
178     private File mPreferencesDir;
179     @GuardedBy("mSync")
180     private File mFilesDir;
181     @GuardedBy("mSync")
182     private File mNoBackupFilesDir;
183     @GuardedBy("mSync")
184     private File mCacheDir;
185     @GuardedBy("mSync")
186     private File mCodeCacheDir;
187 
188     // The system service cache for the system services that are cached per-ContextImpl.
189     final Object[] mServiceCache = SystemServiceRegistry.createServiceCache();
190 
getImpl(Context context)191     static ContextImpl getImpl(Context context) {
192         Context nextContext;
193         while ((context instanceof ContextWrapper) &&
194                 (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
195             context = nextContext;
196         }
197         return (ContextImpl)context;
198     }
199 
200     @Override
getAssets()201     public AssetManager getAssets() {
202         return getResources().getAssets();
203     }
204 
205     @Override
getResources()206     public Resources getResources() {
207         return mResources;
208     }
209 
210     @Override
getPackageManager()211     public PackageManager getPackageManager() {
212         if (mPackageManager != null) {
213             return mPackageManager;
214         }
215 
216         IPackageManager pm = ActivityThread.getPackageManager();
217         if (pm != null) {
218             // Doesn't matter if we make more than one instance.
219             return (mPackageManager = new ApplicationPackageManager(this, pm));
220         }
221 
222         return null;
223     }
224 
225     @Override
getContentResolver()226     public ContentResolver getContentResolver() {
227         return mContentResolver;
228     }
229 
230     @Override
getMainLooper()231     public Looper getMainLooper() {
232         return mMainThread.getLooper();
233     }
234 
235     @Override
getApplicationContext()236     public Context getApplicationContext() {
237         return (mPackageInfo != null) ?
238                 mPackageInfo.getApplication() : mMainThread.getApplication();
239     }
240 
241     @Override
setTheme(int resId)242     public void setTheme(int resId) {
243         if (mThemeResource != resId) {
244             mThemeResource = resId;
245             initializeTheme();
246         }
247     }
248 
249     @Override
getThemeResId()250     public int getThemeResId() {
251         return mThemeResource;
252     }
253 
254     @Override
getTheme()255     public Resources.Theme getTheme() {
256         if (mTheme != null) {
257             return mTheme;
258         }
259 
260         mThemeResource = Resources.selectDefaultTheme(mThemeResource,
261                 getOuterContext().getApplicationInfo().targetSdkVersion);
262         initializeTheme();
263 
264         return mTheme;
265     }
266 
initializeTheme()267     private void initializeTheme() {
268         if (mTheme == null) {
269             mTheme = mResources.newTheme();
270         }
271         mTheme.applyStyle(mThemeResource, true);
272     }
273 
274     @Override
getClassLoader()275     public ClassLoader getClassLoader() {
276         return mPackageInfo != null ?
277                 mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
278     }
279 
280     @Override
getPackageName()281     public String getPackageName() {
282         if (mPackageInfo != null) {
283             return mPackageInfo.getPackageName();
284         }
285         // No mPackageInfo means this is a Context for the system itself,
286         // and this here is its name.
287         return "android";
288     }
289 
290     /** @hide */
291     @Override
getBasePackageName()292     public String getBasePackageName() {
293         return mBasePackageName != null ? mBasePackageName : getPackageName();
294     }
295 
296     /** @hide */
297     @Override
getOpPackageName()298     public String getOpPackageName() {
299         return mOpPackageName != null ? mOpPackageName : getBasePackageName();
300     }
301 
302     @Override
getApplicationInfo()303     public ApplicationInfo getApplicationInfo() {
304         if (mPackageInfo != null) {
305             return mPackageInfo.getApplicationInfo();
306         }
307         throw new RuntimeException("Not supported in system context");
308     }
309 
310     @Override
getPackageResourcePath()311     public String getPackageResourcePath() {
312         if (mPackageInfo != null) {
313             return mPackageInfo.getResDir();
314         }
315         throw new RuntimeException("Not supported in system context");
316     }
317 
318     @Override
getPackageCodePath()319     public String getPackageCodePath() {
320         if (mPackageInfo != null) {
321             return mPackageInfo.getAppDir();
322         }
323         throw new RuntimeException("Not supported in system context");
324     }
325 
326     @Override
getSharedPreferences(String name, int mode)327     public SharedPreferences getSharedPreferences(String name, int mode) {
328         // At least one application in the world actually passes in a null
329         // name.  This happened to work because when we generated the file name
330         // we would stringify it to "null.xml".  Nice.
331         if (mPackageInfo.getApplicationInfo().targetSdkVersion <
332                 Build.VERSION_CODES.KITKAT) {
333             if (name == null) {
334                 name = "null";
335             }
336         }
337 
338         File file;
339         synchronized (ContextImpl.class) {
340             if (mSharedPrefsPaths == null) {
341                 mSharedPrefsPaths = new ArrayMap<>();
342             }
343             file = mSharedPrefsPaths.get(name);
344             if (file == null) {
345                 file = getSharedPreferencesPath(name);
346                 mSharedPrefsPaths.put(name, file);
347             }
348         }
349         return getSharedPreferences(file, mode);
350     }
351 
352     @Override
getSharedPreferences(File file, int mode)353     public SharedPreferences getSharedPreferences(File file, int mode) {
354         checkMode(mode);
355         SharedPreferencesImpl sp;
356         synchronized (ContextImpl.class) {
357             final ArrayMap<File, SharedPreferencesImpl> cache = getSharedPreferencesCacheLocked();
358             sp = cache.get(file);
359             if (sp == null) {
360                 sp = new SharedPreferencesImpl(file, mode);
361                 cache.put(file, sp);
362                 return sp;
363             }
364         }
365         if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
366             getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
367             // If somebody else (some other process) changed the prefs
368             // file behind our back, we reload it.  This has been the
369             // historical (if undocumented) behavior.
370             sp.startReloadIfChangedUnexpectedly();
371         }
372         return sp;
373     }
374 
getSharedPreferencesCacheLocked()375     private ArrayMap<File, SharedPreferencesImpl> getSharedPreferencesCacheLocked() {
376         if (sSharedPrefsCache == null) {
377             sSharedPrefsCache = new ArrayMap<>();
378         }
379 
380         final String packageName = getPackageName();
381         ArrayMap<File, SharedPreferencesImpl> packagePrefs = sSharedPrefsCache.get(packageName);
382         if (packagePrefs == null) {
383             packagePrefs = new ArrayMap<>();
384             sSharedPrefsCache.put(packageName, packagePrefs);
385         }
386 
387         return packagePrefs;
388     }
389 
390     /**
391      * Try our best to migrate all files from source to target that match
392      * requested prefix.
393      *
394      * @return the number of files moved, or -1 if there was trouble.
395      */
moveFiles(File sourceDir, File targetDir, final String prefix)396     private static int moveFiles(File sourceDir, File targetDir, final String prefix) {
397         final File[] sourceFiles = FileUtils.listFilesOrEmpty(sourceDir, new FilenameFilter() {
398             @Override
399             public boolean accept(File dir, String name) {
400                 return name.startsWith(prefix);
401             }
402         });
403 
404         int res = 0;
405         for (File sourceFile : sourceFiles) {
406             final File targetFile = new File(targetDir, sourceFile.getName());
407             Log.d(TAG, "Migrating " + sourceFile + " to " + targetFile);
408             try {
409                 FileUtils.copyFileOrThrow(sourceFile, targetFile);
410                 FileUtils.copyPermissions(sourceFile, targetFile);
411                 if (!sourceFile.delete()) {
412                     throw new IOException("Failed to clean up " + sourceFile);
413                 }
414                 if (res != -1) {
415                     res++;
416                 }
417             } catch (IOException e) {
418                 Log.w(TAG, "Failed to migrate " + sourceFile + ": " + e);
419                 res = -1;
420             }
421         }
422         return res;
423     }
424 
425     @Override
moveSharedPreferencesFrom(Context sourceContext, String name)426     public boolean moveSharedPreferencesFrom(Context sourceContext, String name) {
427         synchronized (ContextImpl.class) {
428             final File source = sourceContext.getSharedPreferencesPath(name);
429             final File target = getSharedPreferencesPath(name);
430 
431             final int res = moveFiles(source.getParentFile(), target.getParentFile(),
432                     source.getName());
433             if (res > 0) {
434                 // We moved at least one file, so evict any in-memory caches for
435                 // either location
436                 final ArrayMap<File, SharedPreferencesImpl> cache =
437                         getSharedPreferencesCacheLocked();
438                 cache.remove(source);
439                 cache.remove(target);
440             }
441             return res != -1;
442         }
443     }
444 
445     @Override
deleteSharedPreferences(String name)446     public boolean deleteSharedPreferences(String name) {
447         synchronized (ContextImpl.class) {
448             final File prefs = getSharedPreferencesPath(name);
449             final File prefsBackup = SharedPreferencesImpl.makeBackupFile(prefs);
450 
451             // Evict any in-memory caches
452             final ArrayMap<File, SharedPreferencesImpl> cache = getSharedPreferencesCacheLocked();
453             cache.remove(prefs);
454 
455             prefs.delete();
456             prefsBackup.delete();
457 
458             // We failed if files are still lingering
459             return !(prefs.exists() || prefsBackup.exists());
460         }
461     }
462 
getPreferencesDir()463     private File getPreferencesDir() {
464         synchronized (mSync) {
465             if (mPreferencesDir == null) {
466                 mPreferencesDir = new File(getDataDir(), "shared_prefs");
467             }
468             return ensurePrivateDirExists(mPreferencesDir);
469         }
470     }
471 
472     @Override
openFileInput(String name)473     public FileInputStream openFileInput(String name)
474         throws FileNotFoundException {
475         File f = makeFilename(getFilesDir(), name);
476         return new FileInputStream(f);
477     }
478 
479     @Override
openFileOutput(String name, int mode)480     public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException {
481         checkMode(mode);
482         final boolean append = (mode&MODE_APPEND) != 0;
483         File f = makeFilename(getFilesDir(), name);
484         try {
485             FileOutputStream fos = new FileOutputStream(f, append);
486             setFilePermissionsFromMode(f.getPath(), mode, 0);
487             return fos;
488         } catch (FileNotFoundException e) {
489         }
490 
491         File parent = f.getParentFile();
492         parent.mkdir();
493         FileUtils.setPermissions(
494             parent.getPath(),
495             FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
496             -1, -1);
497         FileOutputStream fos = new FileOutputStream(f, append);
498         setFilePermissionsFromMode(f.getPath(), mode, 0);
499         return fos;
500     }
501 
502     @Override
deleteFile(String name)503     public boolean deleteFile(String name) {
504         File f = makeFilename(getFilesDir(), name);
505         return f.delete();
506     }
507 
508     /**
509      * Common-path handling of app data dir creation
510      */
ensurePrivateDirExists(File file)511     private static File ensurePrivateDirExists(File file) {
512         if (!file.exists()) {
513             try {
514                 Os.mkdir(file.getAbsolutePath(), 0771);
515                 Os.chmod(file.getAbsolutePath(), 0771);
516             } catch (ErrnoException e) {
517                 if (e.errno == OsConstants.EEXIST) {
518                     // We must have raced with someone; that's okay
519                 } else {
520                     Log.w(TAG, "Failed to ensure " + file + ": " + e.getMessage());
521                 }
522             }
523         }
524         return file;
525     }
526 
527     @Override
getFilesDir()528     public File getFilesDir() {
529         synchronized (mSync) {
530             if (mFilesDir == null) {
531                 mFilesDir = new File(getDataDir(), "files");
532             }
533             return ensurePrivateDirExists(mFilesDir);
534         }
535     }
536 
537     @Override
getNoBackupFilesDir()538     public File getNoBackupFilesDir() {
539         synchronized (mSync) {
540             if (mNoBackupFilesDir == null) {
541                 mNoBackupFilesDir = new File(getDataDir(), "no_backup");
542             }
543             return ensurePrivateDirExists(mNoBackupFilesDir);
544         }
545     }
546 
547     @Override
getExternalFilesDir(String type)548     public File getExternalFilesDir(String type) {
549         // Operates on primary external storage
550         return getExternalFilesDirs(type)[0];
551     }
552 
553     @Override
getExternalFilesDirs(String type)554     public File[] getExternalFilesDirs(String type) {
555         synchronized (mSync) {
556             File[] dirs = Environment.buildExternalStorageAppFilesDirs(getPackageName());
557             if (type != null) {
558                 dirs = Environment.buildPaths(dirs, type);
559             }
560             return ensureExternalDirsExistOrFilter(dirs);
561         }
562     }
563 
564     @Override
getObbDir()565     public File getObbDir() {
566         // Operates on primary external storage
567         return getObbDirs()[0];
568     }
569 
570     @Override
getObbDirs()571     public File[] getObbDirs() {
572         synchronized (mSync) {
573             File[] dirs = Environment.buildExternalStorageAppObbDirs(getPackageName());
574             return ensureExternalDirsExistOrFilter(dirs);
575         }
576     }
577 
578     @Override
getCacheDir()579     public File getCacheDir() {
580         synchronized (mSync) {
581             if (mCacheDir == null) {
582                 mCacheDir = new File(getDataDir(), "cache");
583             }
584             return ensurePrivateDirExists(mCacheDir);
585         }
586     }
587 
588     @Override
getCodeCacheDir()589     public File getCodeCacheDir() {
590         synchronized (mSync) {
591             if (mCodeCacheDir == null) {
592                 mCodeCacheDir = new File(getDataDir(), "code_cache");
593             }
594             return ensurePrivateDirExists(mCodeCacheDir);
595         }
596     }
597 
598     @Override
getExternalCacheDir()599     public File getExternalCacheDir() {
600         // Operates on primary external storage
601         return getExternalCacheDirs()[0];
602     }
603 
604     @Override
getExternalCacheDirs()605     public File[] getExternalCacheDirs() {
606         synchronized (mSync) {
607             File[] dirs = Environment.buildExternalStorageAppCacheDirs(getPackageName());
608             return ensureExternalDirsExistOrFilter(dirs);
609         }
610     }
611 
612     @Override
getExternalMediaDirs()613     public File[] getExternalMediaDirs() {
614         synchronized (mSync) {
615             File[] dirs = Environment.buildExternalStorageAppMediaDirs(getPackageName());
616             return ensureExternalDirsExistOrFilter(dirs);
617         }
618     }
619 
620     @Override
getFileStreamPath(String name)621     public File getFileStreamPath(String name) {
622         return makeFilename(getFilesDir(), name);
623     }
624 
625     @Override
getSharedPreferencesPath(String name)626     public File getSharedPreferencesPath(String name) {
627         return makeFilename(getPreferencesDir(), name + ".xml");
628     }
629 
630     @Override
fileList()631     public String[] fileList() {
632         return FileUtils.listOrEmpty(getFilesDir());
633     }
634 
635     @Override
openOrCreateDatabase(String name, int mode, CursorFactory factory)636     public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
637         return openOrCreateDatabase(name, mode, factory, null);
638     }
639 
640     @Override
openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler)641     public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
642             DatabaseErrorHandler errorHandler) {
643         checkMode(mode);
644         File f = getDatabasePath(name);
645         int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
646         if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
647             flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
648         }
649         if ((mode & MODE_NO_LOCALIZED_COLLATORS) != 0) {
650             flags |= SQLiteDatabase.NO_LOCALIZED_COLLATORS;
651         }
652         SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
653         setFilePermissionsFromMode(f.getPath(), mode, 0);
654         return db;
655     }
656 
657     @Override
moveDatabaseFrom(Context sourceContext, String name)658     public boolean moveDatabaseFrom(Context sourceContext, String name) {
659         synchronized (ContextImpl.class) {
660             final File source = sourceContext.getDatabasePath(name);
661             final File target = getDatabasePath(name);
662             return moveFiles(source.getParentFile(), target.getParentFile(),
663                     source.getName()) != -1;
664         }
665     }
666 
667     @Override
deleteDatabase(String name)668     public boolean deleteDatabase(String name) {
669         try {
670             File f = getDatabasePath(name);
671             return SQLiteDatabase.deleteDatabase(f);
672         } catch (Exception e) {
673         }
674         return false;
675     }
676 
677     @Override
getDatabasePath(String name)678     public File getDatabasePath(String name) {
679         File dir;
680         File f;
681 
682         if (name.charAt(0) == File.separatorChar) {
683             String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
684             dir = new File(dirPath);
685             name = name.substring(name.lastIndexOf(File.separatorChar));
686             f = new File(dir, name);
687 
688             if (!dir.isDirectory() && dir.mkdir()) {
689                 FileUtils.setPermissions(dir.getPath(),
690                     FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
691                     -1, -1);
692             }
693         } else {
694             dir = getDatabasesDir();
695             f = makeFilename(dir, name);
696         }
697 
698         return f;
699     }
700 
701     @Override
databaseList()702     public String[] databaseList() {
703         return FileUtils.listOrEmpty(getDatabasesDir());
704     }
705 
getDatabasesDir()706     private File getDatabasesDir() {
707         synchronized (mSync) {
708             if (mDatabasesDir == null) {
709                 if ("android".equals(getPackageName())) {
710                     mDatabasesDir = new File("/data/system");
711                 } else {
712                     mDatabasesDir = new File(getDataDir(), "databases");
713                 }
714             }
715             return ensurePrivateDirExists(mDatabasesDir);
716         }
717     }
718 
719     @Override
720     @Deprecated
getWallpaper()721     public Drawable getWallpaper() {
722         return getWallpaperManager().getDrawable();
723     }
724 
725     @Override
726     @Deprecated
peekWallpaper()727     public Drawable peekWallpaper() {
728         return getWallpaperManager().peekDrawable();
729     }
730 
731     @Override
732     @Deprecated
getWallpaperDesiredMinimumWidth()733     public int getWallpaperDesiredMinimumWidth() {
734         return getWallpaperManager().getDesiredMinimumWidth();
735     }
736 
737     @Override
738     @Deprecated
getWallpaperDesiredMinimumHeight()739     public int getWallpaperDesiredMinimumHeight() {
740         return getWallpaperManager().getDesiredMinimumHeight();
741     }
742 
743     @Override
744     @Deprecated
setWallpaper(Bitmap bitmap)745     public void setWallpaper(Bitmap bitmap) throws IOException {
746         getWallpaperManager().setBitmap(bitmap);
747     }
748 
749     @Override
750     @Deprecated
setWallpaper(InputStream data)751     public void setWallpaper(InputStream data) throws IOException {
752         getWallpaperManager().setStream(data);
753     }
754 
755     @Override
756     @Deprecated
clearWallpaper()757     public void clearWallpaper() throws IOException {
758         getWallpaperManager().clear();
759     }
760 
getWallpaperManager()761     private WallpaperManager getWallpaperManager() {
762         return getSystemService(WallpaperManager.class);
763     }
764 
765     @Override
startActivity(Intent intent)766     public void startActivity(Intent intent) {
767         warnIfCallingFromSystemProcess();
768         startActivity(intent, null);
769     }
770 
771     /** @hide */
772     @Override
startActivityAsUser(Intent intent, UserHandle user)773     public void startActivityAsUser(Intent intent, UserHandle user) {
774         startActivityAsUser(intent, null, user);
775     }
776 
777     @Override
startActivity(Intent intent, Bundle options)778     public void startActivity(Intent intent, Bundle options) {
779         warnIfCallingFromSystemProcess();
780 
781         // Calling start activity from outside an activity without FLAG_ACTIVITY_NEW_TASK is
782         // generally not allowed, except if the caller specifies the task id the activity should
783         // be launched in.
784         if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0
785                 && options != null && ActivityOptions.fromBundle(options).getLaunchTaskId() == -1) {
786             throw new AndroidRuntimeException(
787                     "Calling startActivity() from outside of an Activity "
788                     + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
789                     + " Is this really what you want?");
790         }
791         mMainThread.getInstrumentation().execStartActivity(
792                 getOuterContext(), mMainThread.getApplicationThread(), null,
793                 (Activity) null, intent, -1, options);
794     }
795 
796     /** @hide */
797     @Override
startActivityAsUser(Intent intent, Bundle options, UserHandle user)798     public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
799         try {
800             ActivityManagerNative.getDefault().startActivityAsUser(
801                 mMainThread.getApplicationThread(), getBasePackageName(), intent,
802                 intent.resolveTypeIfNeeded(getContentResolver()),
803                 null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options,
804                 user.getIdentifier());
805         } catch (RemoteException e) {
806             throw e.rethrowFromSystemServer();
807         }
808     }
809 
810     @Override
startActivities(Intent[] intents)811     public void startActivities(Intent[] intents) {
812         warnIfCallingFromSystemProcess();
813         startActivities(intents, null);
814     }
815 
816     /** @hide */
817     @Override
startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle)818     public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
819         if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
820             throw new AndroidRuntimeException(
821                     "Calling startActivities() from outside of an Activity "
822                     + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
823                     + " Is this really what you want?");
824         }
825         mMainThread.getInstrumentation().execStartActivitiesAsUser(
826                 getOuterContext(), mMainThread.getApplicationThread(), null,
827                 (Activity) null, intents, options, userHandle.getIdentifier());
828     }
829 
830     @Override
startActivities(Intent[] intents, Bundle options)831     public void startActivities(Intent[] intents, Bundle options) {
832         warnIfCallingFromSystemProcess();
833         if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
834             throw new AndroidRuntimeException(
835                     "Calling startActivities() from outside of an Activity "
836                     + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
837                     + " Is this really what you want?");
838         }
839         mMainThread.getInstrumentation().execStartActivities(
840                 getOuterContext(), mMainThread.getApplicationThread(), null,
841                 (Activity) null, intents, options);
842     }
843 
844     @Override
startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)845     public void startIntentSender(IntentSender intent,
846             Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
847             throws IntentSender.SendIntentException {
848         startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
849     }
850 
851     @Override
startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options)852     public void startIntentSender(IntentSender intent, Intent fillInIntent,
853             int flagsMask, int flagsValues, int extraFlags, Bundle options)
854             throws IntentSender.SendIntentException {
855         try {
856             String resolvedType = null;
857             if (fillInIntent != null) {
858                 fillInIntent.migrateExtraStreamToClipData();
859                 fillInIntent.prepareToLeaveProcess(this);
860                 resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
861             }
862             int result = ActivityManagerNative.getDefault()
863                 .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
864                         fillInIntent, resolvedType, null, null,
865                         0, flagsMask, flagsValues, options);
866             if (result == ActivityManager.START_CANCELED) {
867                 throw new IntentSender.SendIntentException();
868             }
869             Instrumentation.checkStartActivityResult(result, null);
870         } catch (RemoteException e) {
871             throw e.rethrowFromSystemServer();
872         }
873     }
874 
875     @Override
sendBroadcast(Intent intent)876     public void sendBroadcast(Intent intent) {
877         warnIfCallingFromSystemProcess();
878         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
879         try {
880             intent.prepareToLeaveProcess(this);
881             ActivityManagerNative.getDefault().broadcastIntent(
882                     mMainThread.getApplicationThread(), intent, resolvedType, null,
883                     Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, false,
884                     getUserId());
885         } catch (RemoteException e) {
886             throw e.rethrowFromSystemServer();
887         }
888     }
889 
890     @Override
sendBroadcast(Intent intent, String receiverPermission)891     public void sendBroadcast(Intent intent, String receiverPermission) {
892         warnIfCallingFromSystemProcess();
893         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
894         String[] receiverPermissions = receiverPermission == null ? null
895                 : new String[] {receiverPermission};
896         try {
897             intent.prepareToLeaveProcess(this);
898             ActivityManagerNative.getDefault().broadcastIntent(
899                     mMainThread.getApplicationThread(), intent, resolvedType, null,
900                     Activity.RESULT_OK, null, null, receiverPermissions, AppOpsManager.OP_NONE,
901                     null, false, false, getUserId());
902         } catch (RemoteException e) {
903             throw e.rethrowFromSystemServer();
904         }
905     }
906 
907     @Override
sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions)908     public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
909         warnIfCallingFromSystemProcess();
910         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
911         try {
912             intent.prepareToLeaveProcess(this);
913             ActivityManagerNative.getDefault().broadcastIntent(
914                     mMainThread.getApplicationThread(), intent, resolvedType, null,
915                     Activity.RESULT_OK, null, null, receiverPermissions, AppOpsManager.OP_NONE,
916                     null, false, false, getUserId());
917         } catch (RemoteException e) {
918             throw e.rethrowFromSystemServer();
919         }
920     }
921 
922     @Override
sendBroadcast(Intent intent, String receiverPermission, Bundle options)923     public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) {
924         warnIfCallingFromSystemProcess();
925         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
926         String[] receiverPermissions = receiverPermission == null ? null
927                 : new String[] {receiverPermission};
928         try {
929             intent.prepareToLeaveProcess(this);
930             ActivityManagerNative.getDefault().broadcastIntent(
931                     mMainThread.getApplicationThread(), intent, resolvedType, null,
932                     Activity.RESULT_OK, null, null, receiverPermissions, AppOpsManager.OP_NONE,
933                     options, false, false, getUserId());
934         } catch (RemoteException e) {
935             throw e.rethrowFromSystemServer();
936         }
937     }
938 
939     @Override
sendBroadcast(Intent intent, String receiverPermission, int appOp)940     public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
941         warnIfCallingFromSystemProcess();
942         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
943         String[] receiverPermissions = receiverPermission == null ? null
944                 : new String[] {receiverPermission};
945         try {
946             intent.prepareToLeaveProcess(this);
947             ActivityManagerNative.getDefault().broadcastIntent(
948                     mMainThread.getApplicationThread(), intent, resolvedType, null,
949                     Activity.RESULT_OK, null, null, receiverPermissions, appOp, null, false, false,
950                     getUserId());
951         } catch (RemoteException e) {
952             throw e.rethrowFromSystemServer();
953         }
954     }
955 
956     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)957     public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
958         warnIfCallingFromSystemProcess();
959         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
960         String[] receiverPermissions = receiverPermission == null ? null
961                 : new String[] {receiverPermission};
962         try {
963             intent.prepareToLeaveProcess(this);
964             ActivityManagerNative.getDefault().broadcastIntent(
965                     mMainThread.getApplicationThread(), intent, resolvedType, null,
966                     Activity.RESULT_OK, null, null, receiverPermissions, AppOpsManager.OP_NONE,
967                     null, true, false, getUserId());
968         } catch (RemoteException e) {
969             throw e.rethrowFromSystemServer();
970         }
971     }
972 
973     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)974     public void sendOrderedBroadcast(Intent intent,
975             String receiverPermission, BroadcastReceiver resultReceiver,
976             Handler scheduler, int initialCode, String initialData,
977             Bundle initialExtras) {
978         sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE,
979                 resultReceiver, scheduler, initialCode, initialData, initialExtras, null);
980     }
981 
982     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)983     public void sendOrderedBroadcast(Intent intent,
984             String receiverPermission, Bundle options, BroadcastReceiver resultReceiver,
985             Handler scheduler, int initialCode, String initialData,
986             Bundle initialExtras) {
987         sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE,
988                 resultReceiver, scheduler, initialCode, initialData, initialExtras, options);
989     }
990 
991     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)992     public void sendOrderedBroadcast(Intent intent,
993             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
994             Handler scheduler, int initialCode, String initialData,
995             Bundle initialExtras) {
996         sendOrderedBroadcast(intent, receiverPermission, appOp,
997                 resultReceiver, scheduler, initialCode, initialData, initialExtras, null);
998     }
999 
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras, Bundle options)1000     void sendOrderedBroadcast(Intent intent,
1001             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1002             Handler scheduler, int initialCode, String initialData,
1003             Bundle initialExtras, Bundle options) {
1004         warnIfCallingFromSystemProcess();
1005         IIntentReceiver rd = null;
1006         if (resultReceiver != null) {
1007             if (mPackageInfo != null) {
1008                 if (scheduler == null) {
1009                     scheduler = mMainThread.getHandler();
1010                 }
1011                 rd = mPackageInfo.getReceiverDispatcher(
1012                     resultReceiver, getOuterContext(), scheduler,
1013                     mMainThread.getInstrumentation(), false);
1014             } else {
1015                 if (scheduler == null) {
1016                     scheduler = mMainThread.getHandler();
1017                 }
1018                 rd = new LoadedApk.ReceiverDispatcher(
1019                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1020             }
1021         }
1022         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1023         String[] receiverPermissions = receiverPermission == null ? null
1024                 : new String[] {receiverPermission};
1025         try {
1026             intent.prepareToLeaveProcess(this);
1027             ActivityManagerNative.getDefault().broadcastIntent(
1028                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1029                 initialCode, initialData, initialExtras, receiverPermissions, appOp,
1030                     options, true, false, getUserId());
1031         } catch (RemoteException e) {
1032             throw e.rethrowFromSystemServer();
1033         }
1034     }
1035 
1036     @Override
sendBroadcastAsUser(Intent intent, UserHandle user)1037     public void sendBroadcastAsUser(Intent intent, UserHandle user) {
1038         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1039         try {
1040             intent.prepareToLeaveProcess(this);
1041             ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
1042                     intent, resolvedType, null, Activity.RESULT_OK, null, null, null,
1043                     AppOpsManager.OP_NONE, null, false, false, user.getIdentifier());
1044         } catch (RemoteException e) {
1045             throw e.rethrowFromSystemServer();
1046         }
1047     }
1048 
1049     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)1050     public void sendBroadcastAsUser(Intent intent, UserHandle user,
1051             String receiverPermission) {
1052         sendBroadcastAsUser(intent, user, receiverPermission, AppOpsManager.OP_NONE);
1053     }
1054 
1055     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp)1056     public void sendBroadcastAsUser(Intent intent, UserHandle user,
1057             String receiverPermission, int appOp) {
1058         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1059         String[] receiverPermissions = receiverPermission == null ? null
1060                 : new String[] {receiverPermission};
1061         try {
1062             intent.prepareToLeaveProcess(this);
1063             ActivityManagerNative.getDefault().broadcastIntent(
1064                     mMainThread.getApplicationThread(), intent, resolvedType, null,
1065                     Activity.RESULT_OK, null, null, receiverPermissions, appOp, null, false, false,
1066                     user.getIdentifier());
1067         } catch (RemoteException e) {
1068             throw e.rethrowFromSystemServer();
1069         }
1070     }
1071 
1072     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1073     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1074             String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
1075             int initialCode, String initialData, Bundle initialExtras) {
1076         sendOrderedBroadcastAsUser(intent, user, receiverPermission, AppOpsManager.OP_NONE,
1077                 null, resultReceiver, scheduler, initialCode, initialData, initialExtras);
1078     }
1079 
1080     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1081     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1082             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
1083             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
1084         sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp,
1085                 null, resultReceiver, scheduler, initialCode, initialData, initialExtras);
1086     }
1087 
1088     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1089     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1090             String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
1091             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
1092         IIntentReceiver rd = null;
1093         if (resultReceiver != null) {
1094             if (mPackageInfo != null) {
1095                 if (scheduler == null) {
1096                     scheduler = mMainThread.getHandler();
1097                 }
1098                 rd = mPackageInfo.getReceiverDispatcher(
1099                     resultReceiver, getOuterContext(), scheduler,
1100                     mMainThread.getInstrumentation(), false);
1101             } else {
1102                 if (scheduler == null) {
1103                     scheduler = mMainThread.getHandler();
1104                 }
1105                 rd = new LoadedApk.ReceiverDispatcher(resultReceiver, getOuterContext(),
1106                         scheduler, null, false).getIIntentReceiver();
1107             }
1108         }
1109         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1110         String[] receiverPermissions = receiverPermission == null ? null
1111                 : new String[] {receiverPermission};
1112         try {
1113             intent.prepareToLeaveProcess(this);
1114             ActivityManagerNative.getDefault().broadcastIntent(
1115                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1116                 initialCode, initialData, initialExtras, receiverPermissions,
1117                     appOp, options, true, false, user.getIdentifier());
1118         } catch (RemoteException e) {
1119             throw e.rethrowFromSystemServer();
1120         }
1121     }
1122 
1123     @Override
1124     @Deprecated
sendStickyBroadcast(Intent intent)1125     public void sendStickyBroadcast(Intent intent) {
1126         warnIfCallingFromSystemProcess();
1127         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1128         try {
1129             intent.prepareToLeaveProcess(this);
1130             ActivityManagerNative.getDefault().broadcastIntent(
1131                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1132                 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true,
1133                 getUserId());
1134         } catch (RemoteException e) {
1135             throw e.rethrowFromSystemServer();
1136         }
1137     }
1138 
1139     @Override
1140     @Deprecated
sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1141     public void sendStickyOrderedBroadcast(Intent intent,
1142             BroadcastReceiver resultReceiver,
1143             Handler scheduler, int initialCode, String initialData,
1144             Bundle initialExtras) {
1145         warnIfCallingFromSystemProcess();
1146         IIntentReceiver rd = null;
1147         if (resultReceiver != null) {
1148             if (mPackageInfo != null) {
1149                 if (scheduler == null) {
1150                     scheduler = mMainThread.getHandler();
1151                 }
1152                 rd = mPackageInfo.getReceiverDispatcher(
1153                     resultReceiver, getOuterContext(), scheduler,
1154                     mMainThread.getInstrumentation(), false);
1155             } else {
1156                 if (scheduler == null) {
1157                     scheduler = mMainThread.getHandler();
1158                 }
1159                 rd = new LoadedApk.ReceiverDispatcher(
1160                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1161             }
1162         }
1163         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1164         try {
1165             intent.prepareToLeaveProcess(this);
1166             ActivityManagerNative.getDefault().broadcastIntent(
1167                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1168                 initialCode, initialData, initialExtras, null,
1169                     AppOpsManager.OP_NONE, null, true, true, getUserId());
1170         } catch (RemoteException e) {
1171             throw e.rethrowFromSystemServer();
1172         }
1173     }
1174 
1175     @Override
1176     @Deprecated
removeStickyBroadcast(Intent intent)1177     public void removeStickyBroadcast(Intent intent) {
1178         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1179         if (resolvedType != null) {
1180             intent = new Intent(intent);
1181             intent.setDataAndType(intent.getData(), resolvedType);
1182         }
1183         try {
1184             intent.prepareToLeaveProcess(this);
1185             ActivityManagerNative.getDefault().unbroadcastIntent(
1186                     mMainThread.getApplicationThread(), intent, getUserId());
1187         } catch (RemoteException e) {
1188             throw e.rethrowFromSystemServer();
1189         }
1190     }
1191 
1192     @Override
1193     @Deprecated
sendStickyBroadcastAsUser(Intent intent, UserHandle user)1194     public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1195         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1196         try {
1197             intent.prepareToLeaveProcess(this);
1198             ActivityManagerNative.getDefault().broadcastIntent(
1199                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1200                 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true,
1201                     user.getIdentifier());
1202         } catch (RemoteException e) {
1203             throw e.rethrowFromSystemServer();
1204         }
1205     }
1206 
1207     @Override
1208     @Deprecated
sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options)1209     public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) {
1210         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1211         try {
1212             intent.prepareToLeaveProcess(this);
1213             ActivityManagerNative.getDefault().broadcastIntent(
1214                 mMainThread.getApplicationThread(), intent, resolvedType, null,
1215                 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, options, false, true,
1216                 user.getIdentifier());
1217         } catch (RemoteException e) {
1218             throw e.rethrowFromSystemServer();
1219         }
1220     }
1221 
1222     @Override
1223     @Deprecated
sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1224     public void sendStickyOrderedBroadcastAsUser(Intent intent,
1225             UserHandle user, BroadcastReceiver resultReceiver,
1226             Handler scheduler, int initialCode, String initialData,
1227             Bundle initialExtras) {
1228         IIntentReceiver rd = null;
1229         if (resultReceiver != null) {
1230             if (mPackageInfo != null) {
1231                 if (scheduler == null) {
1232                     scheduler = mMainThread.getHandler();
1233                 }
1234                 rd = mPackageInfo.getReceiverDispatcher(
1235                     resultReceiver, getOuterContext(), scheduler,
1236                     mMainThread.getInstrumentation(), false);
1237             } else {
1238                 if (scheduler == null) {
1239                     scheduler = mMainThread.getHandler();
1240                 }
1241                 rd = new LoadedApk.ReceiverDispatcher(
1242                         resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1243             }
1244         }
1245         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1246         try {
1247             intent.prepareToLeaveProcess(this);
1248             ActivityManagerNative.getDefault().broadcastIntent(
1249                 mMainThread.getApplicationThread(), intent, resolvedType, rd,
1250                 initialCode, initialData, initialExtras, null,
1251                     AppOpsManager.OP_NONE, null, true, true, user.getIdentifier());
1252         } catch (RemoteException e) {
1253             throw e.rethrowFromSystemServer();
1254         }
1255     }
1256 
1257     @Override
1258     @Deprecated
removeStickyBroadcastAsUser(Intent intent, UserHandle user)1259     public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
1260         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1261         if (resolvedType != null) {
1262             intent = new Intent(intent);
1263             intent.setDataAndType(intent.getData(), resolvedType);
1264         }
1265         try {
1266             intent.prepareToLeaveProcess(this);
1267             ActivityManagerNative.getDefault().unbroadcastIntent(
1268                     mMainThread.getApplicationThread(), intent, user.getIdentifier());
1269         } catch (RemoteException e) {
1270             throw e.rethrowFromSystemServer();
1271         }
1272     }
1273 
1274     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)1275     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1276         return registerReceiver(receiver, filter, null, null);
1277     }
1278 
1279     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)1280     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1281             String broadcastPermission, Handler scheduler) {
1282         return registerReceiverInternal(receiver, getUserId(),
1283                 filter, broadcastPermission, scheduler, getOuterContext());
1284     }
1285 
1286     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)1287     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
1288             IntentFilter filter, String broadcastPermission, Handler scheduler) {
1289         return registerReceiverInternal(receiver, user.getIdentifier(),
1290                 filter, broadcastPermission, scheduler, getOuterContext());
1291     }
1292 
registerReceiverInternal(BroadcastReceiver receiver, int userId, IntentFilter filter, String broadcastPermission, Handler scheduler, Context context)1293     private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
1294             IntentFilter filter, String broadcastPermission,
1295             Handler scheduler, Context context) {
1296         IIntentReceiver rd = null;
1297         if (receiver != null) {
1298             if (mPackageInfo != null && context != null) {
1299                 if (scheduler == null) {
1300                     scheduler = mMainThread.getHandler();
1301                 }
1302                 rd = mPackageInfo.getReceiverDispatcher(
1303                     receiver, context, scheduler,
1304                     mMainThread.getInstrumentation(), true);
1305             } else {
1306                 if (scheduler == null) {
1307                     scheduler = mMainThread.getHandler();
1308                 }
1309                 rd = new LoadedApk.ReceiverDispatcher(
1310                         receiver, context, scheduler, null, true).getIIntentReceiver();
1311             }
1312         }
1313         try {
1314             final Intent intent = ActivityManagerNative.getDefault().registerReceiver(
1315                     mMainThread.getApplicationThread(), mBasePackageName,
1316                     rd, filter, broadcastPermission, userId);
1317             if (intent != null) {
1318                 intent.setExtrasClassLoader(getClassLoader());
1319                 intent.prepareToEnterProcess();
1320             }
1321             return intent;
1322         } catch (RemoteException e) {
1323             throw e.rethrowFromSystemServer();
1324         }
1325     }
1326 
1327     @Override
unregisterReceiver(BroadcastReceiver receiver)1328     public void unregisterReceiver(BroadcastReceiver receiver) {
1329         if (mPackageInfo != null) {
1330             IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
1331                     getOuterContext(), receiver);
1332             try {
1333                 ActivityManagerNative.getDefault().unregisterReceiver(rd);
1334             } catch (RemoteException e) {
1335                 throw e.rethrowFromSystemServer();
1336             }
1337         } else {
1338             throw new RuntimeException("Not supported in system context");
1339         }
1340     }
1341 
validateServiceIntent(Intent service)1342     private void validateServiceIntent(Intent service) {
1343         if (service.getComponent() == null && service.getPackage() == null) {
1344             if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {
1345                 IllegalArgumentException ex = new IllegalArgumentException(
1346                         "Service Intent must be explicit: " + service);
1347                 throw ex;
1348             } else {
1349                 Log.w(TAG, "Implicit intents with startService are not safe: " + service
1350                         + " " + Debug.getCallers(2, 3));
1351             }
1352         }
1353     }
1354 
1355     @Override
startService(Intent service)1356     public ComponentName startService(Intent service) {
1357         warnIfCallingFromSystemProcess();
1358         return startServiceCommon(service, mUser);
1359     }
1360 
1361     @Override
stopService(Intent service)1362     public boolean stopService(Intent service) {
1363         warnIfCallingFromSystemProcess();
1364         return stopServiceCommon(service, mUser);
1365     }
1366 
1367     @Override
startServiceAsUser(Intent service, UserHandle user)1368     public ComponentName startServiceAsUser(Intent service, UserHandle user) {
1369         return startServiceCommon(service, user);
1370     }
1371 
startServiceCommon(Intent service, UserHandle user)1372     private ComponentName startServiceCommon(Intent service, UserHandle user) {
1373         try {
1374             validateServiceIntent(service);
1375             service.prepareToLeaveProcess(this);
1376             ComponentName cn = ActivityManagerNative.getDefault().startService(
1377                 mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(
1378                             getContentResolver()), getOpPackageName(), user.getIdentifier());
1379             if (cn != null) {
1380                 if (cn.getPackageName().equals("!")) {
1381                     throw new SecurityException(
1382                             "Not allowed to start service " + service
1383                             + " without permission " + cn.getClassName());
1384                 } else if (cn.getPackageName().equals("!!")) {
1385                     throw new SecurityException(
1386                             "Unable to start service " + service
1387                             + ": " + cn.getClassName());
1388                 }
1389             }
1390             return cn;
1391         } catch (RemoteException e) {
1392             throw e.rethrowFromSystemServer();
1393         }
1394     }
1395 
1396     @Override
stopServiceAsUser(Intent service, UserHandle user)1397     public boolean stopServiceAsUser(Intent service, UserHandle user) {
1398         return stopServiceCommon(service, user);
1399     }
1400 
stopServiceCommon(Intent service, UserHandle user)1401     private boolean stopServiceCommon(Intent service, UserHandle user) {
1402         try {
1403             validateServiceIntent(service);
1404             service.prepareToLeaveProcess(this);
1405             int res = ActivityManagerNative.getDefault().stopService(
1406                 mMainThread.getApplicationThread(), service,
1407                 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier());
1408             if (res < 0) {
1409                 throw new SecurityException(
1410                         "Not allowed to stop service " + service);
1411             }
1412             return res != 0;
1413         } catch (RemoteException e) {
1414             throw e.rethrowFromSystemServer();
1415         }
1416     }
1417 
1418     @Override
bindService(Intent service, ServiceConnection conn, int flags)1419     public boolean bindService(Intent service, ServiceConnection conn,
1420             int flags) {
1421         warnIfCallingFromSystemProcess();
1422         return bindServiceCommon(service, conn, flags, mMainThread.getHandler(),
1423                 Process.myUserHandle());
1424     }
1425 
1426     /** @hide */
1427     @Override
bindServiceAsUser(Intent service, ServiceConnection conn, int flags, UserHandle user)1428     public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
1429             UserHandle user) {
1430         return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), user);
1431     }
1432 
1433     /** @hide */
1434     @Override
bindServiceAsUser(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user)1435     public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
1436             Handler handler, UserHandle user) {
1437         if (handler == null) {
1438             throw new IllegalArgumentException("handler must not be null.");
1439         }
1440         return bindServiceCommon(service, conn, flags, handler, user);
1441     }
1442 
bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user)1443     private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler
1444             handler, UserHandle user) {
1445         IServiceConnection sd;
1446         if (conn == null) {
1447             throw new IllegalArgumentException("connection is null");
1448         }
1449         if (mPackageInfo != null) {
1450             sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
1451         } else {
1452             throw new RuntimeException("Not supported in system context");
1453         }
1454         validateServiceIntent(service);
1455         try {
1456             IBinder token = getActivityToken();
1457             if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1458                     && mPackageInfo.getApplicationInfo().targetSdkVersion
1459                     < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1460                 flags |= BIND_WAIVE_PRIORITY;
1461             }
1462             service.prepareToLeaveProcess(this);
1463             int res = ActivityManagerNative.getDefault().bindService(
1464                 mMainThread.getApplicationThread(), getActivityToken(), service,
1465                 service.resolveTypeIfNeeded(getContentResolver()),
1466                 sd, flags, getOpPackageName(), user.getIdentifier());
1467             if (res < 0) {
1468                 throw new SecurityException(
1469                         "Not allowed to bind to service " + service);
1470             }
1471             return res != 0;
1472         } catch (RemoteException e) {
1473             throw e.rethrowFromSystemServer();
1474         }
1475     }
1476 
1477     @Override
unbindService(ServiceConnection conn)1478     public void unbindService(ServiceConnection conn) {
1479         if (conn == null) {
1480             throw new IllegalArgumentException("connection is null");
1481         }
1482         if (mPackageInfo != null) {
1483             IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
1484                     getOuterContext(), conn);
1485             try {
1486                 ActivityManagerNative.getDefault().unbindService(sd);
1487             } catch (RemoteException e) {
1488                 throw e.rethrowFromSystemServer();
1489             }
1490         } else {
1491             throw new RuntimeException("Not supported in system context");
1492         }
1493     }
1494 
1495     @Override
startInstrumentation(ComponentName className, String profileFile, Bundle arguments)1496     public boolean startInstrumentation(ComponentName className,
1497             String profileFile, Bundle arguments) {
1498         try {
1499             if (arguments != null) {
1500                 arguments.setAllowFds(false);
1501             }
1502             return ActivityManagerNative.getDefault().startInstrumentation(
1503                     className, profileFile, 0, arguments, null, null, getUserId(),
1504                     null /* ABI override */);
1505         } catch (RemoteException e) {
1506             throw e.rethrowFromSystemServer();
1507         }
1508     }
1509 
1510     @Override
getSystemService(String name)1511     public Object getSystemService(String name) {
1512         return SystemServiceRegistry.getSystemService(this, name);
1513     }
1514 
1515     @Override
getSystemServiceName(Class<?> serviceClass)1516     public String getSystemServiceName(Class<?> serviceClass) {
1517         return SystemServiceRegistry.getSystemServiceName(serviceClass);
1518     }
1519 
1520     @Override
checkPermission(String permission, int pid, int uid)1521     public int checkPermission(String permission, int pid, int uid) {
1522         if (permission == null) {
1523             throw new IllegalArgumentException("permission is null");
1524         }
1525 
1526         try {
1527             return ActivityManagerNative.getDefault().checkPermission(
1528                     permission, pid, uid);
1529         } catch (RemoteException e) {
1530             throw e.rethrowFromSystemServer();
1531         }
1532     }
1533 
1534     /** @hide */
1535     @Override
checkPermission(String permission, int pid, int uid, IBinder callerToken)1536     public int checkPermission(String permission, int pid, int uid, IBinder callerToken) {
1537         if (permission == null) {
1538             throw new IllegalArgumentException("permission is null");
1539         }
1540 
1541         try {
1542             return ActivityManagerNative.getDefault().checkPermissionWithToken(
1543                     permission, pid, uid, callerToken);
1544         } catch (RemoteException e) {
1545             throw e.rethrowFromSystemServer();
1546         }
1547     }
1548 
1549     @Override
checkCallingPermission(String permission)1550     public int checkCallingPermission(String permission) {
1551         if (permission == null) {
1552             throw new IllegalArgumentException("permission is null");
1553         }
1554 
1555         int pid = Binder.getCallingPid();
1556         if (pid != Process.myPid()) {
1557             return checkPermission(permission, pid, Binder.getCallingUid());
1558         }
1559         return PackageManager.PERMISSION_DENIED;
1560     }
1561 
1562     @Override
checkCallingOrSelfPermission(String permission)1563     public int checkCallingOrSelfPermission(String permission) {
1564         if (permission == null) {
1565             throw new IllegalArgumentException("permission is null");
1566         }
1567 
1568         return checkPermission(permission, Binder.getCallingPid(),
1569                 Binder.getCallingUid());
1570     }
1571 
1572     @Override
checkSelfPermission(String permission)1573     public int checkSelfPermission(String permission) {
1574         if (permission == null) {
1575             throw new IllegalArgumentException("permission is null");
1576         }
1577 
1578         return checkPermission(permission, Process.myPid(), Process.myUid());
1579     }
1580 
enforce( String permission, int resultOfCheck, boolean selfToo, int uid, String message)1581     private void enforce(
1582             String permission, int resultOfCheck,
1583             boolean selfToo, int uid, String message) {
1584         if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1585             throw new SecurityException(
1586                     (message != null ? (message + ": ") : "") +
1587                     (selfToo
1588                      ? "Neither user " + uid + " nor current process has "
1589                      : "uid " + uid + " does not have ") +
1590                     permission +
1591                     ".");
1592         }
1593     }
1594 
1595     @Override
enforcePermission( String permission, int pid, int uid, String message)1596     public void enforcePermission(
1597             String permission, int pid, int uid, String message) {
1598         enforce(permission,
1599                 checkPermission(permission, pid, uid),
1600                 false,
1601                 uid,
1602                 message);
1603     }
1604 
1605     @Override
enforceCallingPermission(String permission, String message)1606     public void enforceCallingPermission(String permission, String message) {
1607         enforce(permission,
1608                 checkCallingPermission(permission),
1609                 false,
1610                 Binder.getCallingUid(),
1611                 message);
1612     }
1613 
1614     @Override
enforceCallingOrSelfPermission( String permission, String message)1615     public void enforceCallingOrSelfPermission(
1616             String permission, String message) {
1617         enforce(permission,
1618                 checkCallingOrSelfPermission(permission),
1619                 true,
1620                 Binder.getCallingUid(),
1621                 message);
1622     }
1623 
1624     @Override
grantUriPermission(String toPackage, Uri uri, int modeFlags)1625     public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
1626          try {
1627             ActivityManagerNative.getDefault().grantUriPermission(
1628                     mMainThread.getApplicationThread(), toPackage,
1629                     ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri));
1630         } catch (RemoteException e) {
1631             throw e.rethrowFromSystemServer();
1632         }
1633     }
1634 
1635     @Override
revokeUriPermission(Uri uri, int modeFlags)1636     public void revokeUriPermission(Uri uri, int modeFlags) {
1637          try {
1638             ActivityManagerNative.getDefault().revokeUriPermission(
1639                     mMainThread.getApplicationThread(),
1640                     ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri));
1641         } catch (RemoteException e) {
1642             throw e.rethrowFromSystemServer();
1643         }
1644     }
1645 
1646     @Override
checkUriPermission(Uri uri, int pid, int uid, int modeFlags)1647     public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
1648         try {
1649             return ActivityManagerNative.getDefault().checkUriPermission(
1650                     ContentProvider.getUriWithoutUserId(uri), pid, uid, modeFlags,
1651                     resolveUserId(uri), null);
1652         } catch (RemoteException e) {
1653             throw e.rethrowFromSystemServer();
1654         }
1655     }
1656 
1657     /** @hide */
1658     @Override
checkUriPermission(Uri uri, int pid, int uid, int modeFlags, IBinder callerToken)1659     public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags, IBinder callerToken) {
1660         try {
1661             return ActivityManagerNative.getDefault().checkUriPermission(
1662                     ContentProvider.getUriWithoutUserId(uri), pid, uid, modeFlags,
1663                     resolveUserId(uri), callerToken);
1664         } catch (RemoteException e) {
1665             throw e.rethrowFromSystemServer();
1666         }
1667     }
1668 
resolveUserId(Uri uri)1669     private int resolveUserId(Uri uri) {
1670         return ContentProvider.getUserIdFromUri(uri, getUserId());
1671     }
1672 
1673     @Override
checkCallingUriPermission(Uri uri, int modeFlags)1674     public int checkCallingUriPermission(Uri uri, int modeFlags) {
1675         int pid = Binder.getCallingPid();
1676         if (pid != Process.myPid()) {
1677             return checkUriPermission(uri, pid,
1678                     Binder.getCallingUid(), modeFlags);
1679         }
1680         return PackageManager.PERMISSION_DENIED;
1681     }
1682 
1683     @Override
checkCallingOrSelfUriPermission(Uri uri, int modeFlags)1684     public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
1685         return checkUriPermission(uri, Binder.getCallingPid(),
1686                 Binder.getCallingUid(), modeFlags);
1687     }
1688 
1689     @Override
checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags)1690     public int checkUriPermission(Uri uri, String readPermission,
1691             String writePermission, int pid, int uid, int modeFlags) {
1692         if (DEBUG) {
1693             Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
1694                     + readPermission + " writePermission=" + writePermission
1695                     + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
1696         }
1697         if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
1698             if (readPermission == null
1699                     || checkPermission(readPermission, pid, uid)
1700                     == PackageManager.PERMISSION_GRANTED) {
1701                 return PackageManager.PERMISSION_GRANTED;
1702             }
1703         }
1704         if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
1705             if (writePermission == null
1706                     || checkPermission(writePermission, pid, uid)
1707                     == PackageManager.PERMISSION_GRANTED) {
1708                 return PackageManager.PERMISSION_GRANTED;
1709             }
1710         }
1711         return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
1712                 : PackageManager.PERMISSION_DENIED;
1713     }
1714 
uriModeFlagToString(int uriModeFlags)1715     private String uriModeFlagToString(int uriModeFlags) {
1716         StringBuilder builder = new StringBuilder();
1717         if ((uriModeFlags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
1718             builder.append("read and ");
1719         }
1720         if ((uriModeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
1721             builder.append("write and ");
1722         }
1723         if ((uriModeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0) {
1724             builder.append("persistable and ");
1725         }
1726         if ((uriModeFlags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0) {
1727             builder.append("prefix and ");
1728         }
1729 
1730         if (builder.length() > 5) {
1731             builder.setLength(builder.length() - 5);
1732             return builder.toString();
1733         } else {
1734             throw new IllegalArgumentException("Unknown permission mode flags: " + uriModeFlags);
1735         }
1736     }
1737 
enforceForUri( int modeFlags, int resultOfCheck, boolean selfToo, int uid, Uri uri, String message)1738     private void enforceForUri(
1739             int modeFlags, int resultOfCheck, boolean selfToo,
1740             int uid, Uri uri, String message) {
1741         if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
1742             throw new SecurityException(
1743                     (message != null ? (message + ": ") : "") +
1744                     (selfToo
1745                      ? "Neither user " + uid + " nor current process has "
1746                      : "User " + uid + " does not have ") +
1747                     uriModeFlagToString(modeFlags) +
1748                     " permission on " +
1749                     uri +
1750                     ".");
1751         }
1752     }
1753 
1754     @Override
enforceUriPermission( Uri uri, int pid, int uid, int modeFlags, String message)1755     public void enforceUriPermission(
1756             Uri uri, int pid, int uid, int modeFlags, String message) {
1757         enforceForUri(
1758                 modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
1759                 false, uid, uri, message);
1760     }
1761 
1762     @Override
enforceCallingUriPermission( Uri uri, int modeFlags, String message)1763     public void enforceCallingUriPermission(
1764             Uri uri, int modeFlags, String message) {
1765         enforceForUri(
1766                 modeFlags, checkCallingUriPermission(uri, modeFlags),
1767                 false,
1768                 Binder.getCallingUid(), uri, message);
1769     }
1770 
1771     @Override
enforceCallingOrSelfUriPermission( Uri uri, int modeFlags, String message)1772     public void enforceCallingOrSelfUriPermission(
1773             Uri uri, int modeFlags, String message) {
1774         enforceForUri(
1775                 modeFlags,
1776                 checkCallingOrSelfUriPermission(uri, modeFlags), true,
1777                 Binder.getCallingUid(), uri, message);
1778     }
1779 
1780     @Override
enforceUriPermission( Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message)1781     public void enforceUriPermission(
1782             Uri uri, String readPermission, String writePermission,
1783             int pid, int uid, int modeFlags, String message) {
1784         enforceForUri(modeFlags,
1785                       checkUriPermission(
1786                               uri, readPermission, writePermission, pid, uid,
1787                               modeFlags),
1788                       false,
1789                       uid,
1790                       uri,
1791                       message);
1792     }
1793 
1794     /**
1795      * Logs a warning if the system process directly called a method such as
1796      * {@link #startService(Intent)} instead of {@link #startServiceAsUser(Intent, UserHandle)}.
1797      * The "AsUser" variants allow us to properly enforce the user's restrictions.
1798      */
warnIfCallingFromSystemProcess()1799     private void warnIfCallingFromSystemProcess() {
1800         if (Process.myUid() == Process.SYSTEM_UID) {
1801             Slog.w(TAG, "Calling a method in the system process without a qualified user: "
1802                     + Debug.getCallers(5));
1803         }
1804     }
1805 
1806     @Override
createApplicationContext(ApplicationInfo application, int flags)1807     public Context createApplicationContext(ApplicationInfo application, int flags)
1808             throws NameNotFoundException {
1809         LoadedApk pi = mMainThread.getPackageInfo(application, mResources.getCompatibilityInfo(),
1810                 flags | CONTEXT_REGISTER_PACKAGE);
1811         if (pi != null) {
1812             ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken,
1813                     new UserHandle(UserHandle.getUserId(application.uid)), flags,
1814                     mDisplay, null, Display.INVALID_DISPLAY);
1815             if (c.mResources != null) {
1816                 return c;
1817             }
1818         }
1819 
1820         throw new PackageManager.NameNotFoundException(
1821                 "Application package " + application.packageName + " not found");
1822     }
1823 
1824     @Override
createPackageContext(String packageName, int flags)1825     public Context createPackageContext(String packageName, int flags)
1826             throws NameNotFoundException {
1827         return createPackageContextAsUser(packageName, flags,
1828                 mUser != null ? mUser : Process.myUserHandle());
1829     }
1830 
1831     @Override
createPackageContextAsUser(String packageName, int flags, UserHandle user)1832     public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
1833             throws NameNotFoundException {
1834         if (packageName.equals("system") || packageName.equals("android")) {
1835             return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
1836                     user, flags, mDisplay, null, Display.INVALID_DISPLAY);
1837         }
1838 
1839         LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(),
1840                 flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier());
1841         if (pi != null) {
1842             ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken,
1843                     user, flags, mDisplay, null, Display.INVALID_DISPLAY);
1844             if (c.mResources != null) {
1845                 return c;
1846             }
1847         }
1848 
1849         // Should be a better exception.
1850         throw new PackageManager.NameNotFoundException(
1851                 "Application package " + packageName + " not found");
1852     }
1853 
1854     @Override
createConfigurationContext(Configuration overrideConfiguration)1855     public Context createConfigurationContext(Configuration overrideConfiguration) {
1856         if (overrideConfiguration == null) {
1857             throw new IllegalArgumentException("overrideConfiguration must not be null");
1858         }
1859 
1860         return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
1861                 mUser, mFlags, mDisplay, overrideConfiguration, Display.INVALID_DISPLAY);
1862     }
1863 
1864     @Override
createDisplayContext(Display display)1865     public Context createDisplayContext(Display display) {
1866         if (display == null) {
1867             throw new IllegalArgumentException("display must not be null");
1868         }
1869 
1870         return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
1871                 mUser, mFlags, display, null, Display.INVALID_DISPLAY);
1872     }
1873 
1874     @Override
createDeviceProtectedStorageContext()1875     public Context createDeviceProtectedStorageContext() {
1876         final int flags = (mFlags & ~Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE)
1877                 | Context.CONTEXT_DEVICE_PROTECTED_STORAGE;
1878         return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
1879                 mUser, flags, mDisplay, null, Display.INVALID_DISPLAY);
1880     }
1881 
1882     @Override
createCredentialProtectedStorageContext()1883     public Context createCredentialProtectedStorageContext() {
1884         final int flags = (mFlags & ~Context.CONTEXT_DEVICE_PROTECTED_STORAGE)
1885                 | Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE;
1886         return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken,
1887                 mUser, flags, mDisplay, null, Display.INVALID_DISPLAY);
1888     }
1889 
1890     @Override
isRestricted()1891     public boolean isRestricted() {
1892         return (mFlags & Context.CONTEXT_RESTRICTED) != 0;
1893     }
1894 
1895     @Override
isDeviceProtectedStorage()1896     public boolean isDeviceProtectedStorage() {
1897         return (mFlags & Context.CONTEXT_DEVICE_PROTECTED_STORAGE) != 0;
1898     }
1899 
1900     @Override
isCredentialProtectedStorage()1901     public boolean isCredentialProtectedStorage() {
1902         return (mFlags & Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE) != 0;
1903     }
1904 
1905     @Override
getDisplay()1906     public Display getDisplay() {
1907         final DisplayAdjustments displayAdjustments = mResources.getDisplayAdjustments();
1908         if (mDisplay == null) {
1909             return mResourcesManager.getAdjustedDisplay(Display.DEFAULT_DISPLAY,
1910                     displayAdjustments);
1911         }
1912 
1913         if (!mDisplay.getDisplayAdjustments().equals(displayAdjustments)) {
1914             mDisplay = mResourcesManager.getAdjustedDisplay(mDisplay.getDisplayId(),
1915                     displayAdjustments);
1916         }
1917         return mDisplay;
1918     }
1919 
1920     @Override
getDisplayAdjustments(int displayId)1921     public DisplayAdjustments getDisplayAdjustments(int displayId) {
1922         return mResources.getDisplayAdjustments();
1923     }
1924 
1925     @Override
getDataDir()1926     public File getDataDir() {
1927         if (mPackageInfo != null) {
1928             File res = null;
1929             if (isCredentialProtectedStorage()) {
1930                 res = mPackageInfo.getCredentialProtectedDataDirFile();
1931             } else if (isDeviceProtectedStorage()) {
1932                 res = mPackageInfo.getDeviceProtectedDataDirFile();
1933             } else {
1934                 res = mPackageInfo.getDataDirFile();
1935             }
1936 
1937             if (res != null) {
1938                 if (!res.exists() && android.os.Process.myUid() == android.os.Process.SYSTEM_UID) {
1939                     Log.wtf(TAG, "Data directory doesn't exist for package " + getPackageName(),
1940                             new Throwable());
1941                 }
1942                 return res;
1943             } else {
1944                 throw new RuntimeException(
1945                         "No data directory found for package " + getPackageName());
1946             }
1947         } else {
1948             throw new RuntimeException(
1949                     "No package details found for package " + getPackageName());
1950         }
1951     }
1952 
1953     @Override
getDir(String name, int mode)1954     public File getDir(String name, int mode) {
1955         checkMode(mode);
1956         name = "app_" + name;
1957         File file = makeFilename(getDataDir(), name);
1958         if (!file.exists()) {
1959             file.mkdir();
1960             setFilePermissionsFromMode(file.getPath(), mode,
1961                     FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
1962         }
1963         return file;
1964     }
1965 
1966     /** {@hide} */
1967     @Override
getUserId()1968     public int getUserId() {
1969         return mUser.getIdentifier();
1970     }
1971 
createSystemContext(ActivityThread mainThread)1972     static ContextImpl createSystemContext(ActivityThread mainThread) {
1973         LoadedApk packageInfo = new LoadedApk(mainThread);
1974         ContextImpl context = new ContextImpl(null, mainThread,
1975                 packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY);
1976         context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
1977                 context.mResourcesManager.getDisplayMetrics());
1978         return context;
1979     }
1980 
createAppContext(ActivityThread mainThread, LoadedApk packageInfo)1981     static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
1982         if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
1983         return new ContextImpl(null, mainThread,
1984                 packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY);
1985     }
1986 
createActivityContext(ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken, int displayId, Configuration overrideConfiguration)1987     static ContextImpl createActivityContext(ActivityThread mainThread,
1988             LoadedApk packageInfo, IBinder activityToken, int displayId,
1989             Configuration overrideConfiguration) {
1990         if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
1991         return new ContextImpl(null, mainThread, packageInfo, activityToken, null, 0,
1992                 null, overrideConfiguration, displayId);
1993     }
1994 
ContextImpl(ContextImpl container, ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken, UserHandle user, int flags, Display display, Configuration overrideConfiguration, int createDisplayWithId)1995     private ContextImpl(ContextImpl container, ActivityThread mainThread,
1996             LoadedApk packageInfo, IBinder activityToken, UserHandle user, int flags,
1997             Display display, Configuration overrideConfiguration, int createDisplayWithId) {
1998         mOuterContext = this;
1999 
2000         // If creator didn't specify which storage to use, use the default
2001         // location for application.
2002         if ((flags & (Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE
2003                 | Context.CONTEXT_DEVICE_PROTECTED_STORAGE)) == 0) {
2004             final File dataDir = packageInfo.getDataDirFile();
2005             if (Objects.equals(dataDir, packageInfo.getCredentialProtectedDataDirFile())) {
2006                 flags |= Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE;
2007             } else if (Objects.equals(dataDir, packageInfo.getDeviceProtectedDataDirFile())) {
2008                 flags |= Context.CONTEXT_DEVICE_PROTECTED_STORAGE;
2009             }
2010         }
2011 
2012         mMainThread = mainThread;
2013         mActivityToken = activityToken;
2014         mFlags = flags;
2015 
2016         if (user == null) {
2017             user = Process.myUserHandle();
2018         }
2019         mUser = user;
2020 
2021         mPackageInfo = packageInfo;
2022         mResourcesManager = ResourcesManager.getInstance();
2023 
2024         final int displayId = (createDisplayWithId != Display.INVALID_DISPLAY)
2025                 ? createDisplayWithId
2026                 : (display != null) ? display.getDisplayId() : Display.DEFAULT_DISPLAY;
2027 
2028         CompatibilityInfo compatInfo = null;
2029         if (container != null) {
2030             compatInfo = container.getDisplayAdjustments(displayId).getCompatibilityInfo();
2031         }
2032         if (compatInfo == null) {
2033             compatInfo = (displayId == Display.DEFAULT_DISPLAY)
2034                     ? packageInfo.getCompatibilityInfo()
2035                     : CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
2036         }
2037 
2038         Resources resources = packageInfo.getResources(mainThread);
2039         if (resources != null) {
2040             if (displayId != Display.DEFAULT_DISPLAY
2041                     || overrideConfiguration != null
2042                     || (compatInfo != null && compatInfo.applicationScale
2043                             != resources.getCompatibilityInfo().applicationScale)) {
2044 
2045                 if (container != null) {
2046                     // This is a nested Context, so it can't be a base Activity context.
2047                     // Just create a regular Resources object associated with the Activity.
2048                     resources = mResourcesManager.getResources(
2049                             activityToken,
2050                             packageInfo.getResDir(),
2051                             packageInfo.getSplitResDirs(),
2052                             packageInfo.getOverlayDirs(),
2053                             packageInfo.getApplicationInfo().sharedLibraryFiles,
2054                             displayId,
2055                             overrideConfiguration,
2056                             compatInfo,
2057                             packageInfo.getClassLoader());
2058                 } else {
2059                     // This is not a nested Context, so it must be the root Activity context.
2060                     // All other nested Contexts will inherit the configuration set here.
2061                     resources = mResourcesManager.createBaseActivityResources(
2062                             activityToken,
2063                             packageInfo.getResDir(),
2064                             packageInfo.getSplitResDirs(),
2065                             packageInfo.getOverlayDirs(),
2066                             packageInfo.getApplicationInfo().sharedLibraryFiles,
2067                             displayId,
2068                             overrideConfiguration,
2069                             compatInfo,
2070                             packageInfo.getClassLoader());
2071                 }
2072             }
2073         }
2074         mResources = resources;
2075 
2076         mDisplay = (createDisplayWithId == Display.INVALID_DISPLAY) ? display
2077                 : mResourcesManager.getAdjustedDisplay(displayId, mResources.getDisplayAdjustments());
2078 
2079         if (container != null) {
2080             mBasePackageName = container.mBasePackageName;
2081             mOpPackageName = container.mOpPackageName;
2082         } else {
2083             mBasePackageName = packageInfo.mPackageName;
2084             ApplicationInfo ainfo = packageInfo.getApplicationInfo();
2085             if (ainfo.uid == Process.SYSTEM_UID && ainfo.uid != Process.myUid()) {
2086                 // Special case: system components allow themselves to be loaded in to other
2087                 // processes.  For purposes of app ops, we must then consider the context as
2088                 // belonging to the package of this process, not the system itself, otherwise
2089                 // the package+uid verifications in app ops will fail.
2090                 mOpPackageName = ActivityThread.currentPackageName();
2091             } else {
2092                 mOpPackageName = mBasePackageName;
2093             }
2094         }
2095 
2096         mContentResolver = new ApplicationContentResolver(this, mainThread, user);
2097     }
2098 
installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader)2099     void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
2100         mPackageInfo.installSystemApplicationInfo(info, classLoader);
2101     }
2102 
scheduleFinalCleanup(String who, String what)2103     final void scheduleFinalCleanup(String who, String what) {
2104         mMainThread.scheduleContextCleanup(this, who, what);
2105     }
2106 
performFinalCleanup(String who, String what)2107     final void performFinalCleanup(String who, String what) {
2108         //Log.i(TAG, "Cleanup up context: " + this);
2109         mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
2110     }
2111 
getReceiverRestrictedContext()2112     final Context getReceiverRestrictedContext() {
2113         if (mReceiverRestrictedContext != null) {
2114             return mReceiverRestrictedContext;
2115         }
2116         return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
2117     }
2118 
setOuterContext(Context context)2119     final void setOuterContext(Context context) {
2120         mOuterContext = context;
2121     }
2122 
getOuterContext()2123     final Context getOuterContext() {
2124         return mOuterContext;
2125     }
2126 
getActivityToken()2127     final IBinder getActivityToken() {
2128         return mActivityToken;
2129     }
2130 
checkMode(int mode)2131     private void checkMode(int mode) {
2132         if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.N) {
2133             if ((mode & MODE_WORLD_READABLE) != 0) {
2134                 throw new SecurityException("MODE_WORLD_READABLE no longer supported");
2135             }
2136             if ((mode & MODE_WORLD_WRITEABLE) != 0) {
2137                 throw new SecurityException("MODE_WORLD_WRITEABLE no longer supported");
2138             }
2139         }
2140     }
2141 
2142     @SuppressWarnings("deprecation")
setFilePermissionsFromMode(String name, int mode, int extraPermissions)2143     static void setFilePermissionsFromMode(String name, int mode,
2144             int extraPermissions) {
2145         int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
2146             |FileUtils.S_IRGRP|FileUtils.S_IWGRP
2147             |extraPermissions;
2148         if ((mode&MODE_WORLD_READABLE) != 0) {
2149             perms |= FileUtils.S_IROTH;
2150         }
2151         if ((mode&MODE_WORLD_WRITEABLE) != 0) {
2152             perms |= FileUtils.S_IWOTH;
2153         }
2154         if (DEBUG) {
2155             Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
2156                   + ", perms=0x" + Integer.toHexString(perms));
2157         }
2158         FileUtils.setPermissions(name, perms, -1, -1);
2159     }
2160 
makeFilename(File base, String name)2161     private File makeFilename(File base, String name) {
2162         if (name.indexOf(File.separatorChar) < 0) {
2163             return new File(base, name);
2164         }
2165         throw new IllegalArgumentException(
2166                 "File " + name + " contains a path separator");
2167     }
2168 
2169     /**
2170      * Ensure that given directories exist, trying to create them if missing. If
2171      * unable to create, they are filtered by replacing with {@code null}.
2172      */
ensureExternalDirsExistOrFilter(File[] dirs)2173     private File[] ensureExternalDirsExistOrFilter(File[] dirs) {
2174         File[] result = new File[dirs.length];
2175         for (int i = 0; i < dirs.length; i++) {
2176             File dir = dirs[i];
2177             if (!dir.exists()) {
2178                 if (!dir.mkdirs()) {
2179                     // recheck existence in case of cross-process race
2180                     if (!dir.exists()) {
2181                         // Failing to mkdir() may be okay, since we might not have
2182                         // enough permissions; ask vold to create on our behalf.
2183                         final IMountService mount = IMountService.Stub.asInterface(
2184                                 ServiceManager.getService("mount"));
2185                         try {
2186                             final int res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
2187                             if (res != 0) {
2188                                 Log.w(TAG, "Failed to ensure " + dir + ": " + res);
2189                                 dir = null;
2190                             }
2191                         } catch (Exception e) {
2192                             Log.w(TAG, "Failed to ensure " + dir + ": " + e);
2193                             dir = null;
2194                         }
2195                     }
2196                 }
2197             }
2198             result[i] = dir;
2199         }
2200         return result;
2201     }
2202 
2203     // ----------------------------------------------------------------------
2204     // ----------------------------------------------------------------------
2205     // ----------------------------------------------------------------------
2206 
2207     private static final class ApplicationContentResolver extends ContentResolver {
2208         private final ActivityThread mMainThread;
2209         private final UserHandle mUser;
2210 
ApplicationContentResolver( Context context, ActivityThread mainThread, UserHandle user)2211         public ApplicationContentResolver(
2212                 Context context, ActivityThread mainThread, UserHandle user) {
2213             super(context);
2214             mMainThread = Preconditions.checkNotNull(mainThread);
2215             mUser = Preconditions.checkNotNull(user);
2216         }
2217 
2218         @Override
acquireProvider(Context context, String auth)2219         protected IContentProvider acquireProvider(Context context, String auth) {
2220             return mMainThread.acquireProvider(context,
2221                     ContentProvider.getAuthorityWithoutUserId(auth),
2222                     resolveUserIdFromAuthority(auth), true);
2223         }
2224 
2225         @Override
acquireExistingProvider(Context context, String auth)2226         protected IContentProvider acquireExistingProvider(Context context, String auth) {
2227             return mMainThread.acquireExistingProvider(context,
2228                     ContentProvider.getAuthorityWithoutUserId(auth),
2229                     resolveUserIdFromAuthority(auth), true);
2230         }
2231 
2232         @Override
releaseProvider(IContentProvider provider)2233         public boolean releaseProvider(IContentProvider provider) {
2234             return mMainThread.releaseProvider(provider, true);
2235         }
2236 
2237         @Override
acquireUnstableProvider(Context c, String auth)2238         protected IContentProvider acquireUnstableProvider(Context c, String auth) {
2239             return mMainThread.acquireProvider(c,
2240                     ContentProvider.getAuthorityWithoutUserId(auth),
2241                     resolveUserIdFromAuthority(auth), false);
2242         }
2243 
2244         @Override
releaseUnstableProvider(IContentProvider icp)2245         public boolean releaseUnstableProvider(IContentProvider icp) {
2246             return mMainThread.releaseProvider(icp, false);
2247         }
2248 
2249         @Override
unstableProviderDied(IContentProvider icp)2250         public void unstableProviderDied(IContentProvider icp) {
2251             mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
2252         }
2253 
2254         @Override
appNotRespondingViaProvider(IContentProvider icp)2255         public void appNotRespondingViaProvider(IContentProvider icp) {
2256             mMainThread.appNotRespondingViaProvider(icp.asBinder());
2257         }
2258 
2259         /** @hide */
resolveUserIdFromAuthority(String auth)2260         protected int resolveUserIdFromAuthority(String auth) {
2261             return ContentProvider.getUserIdFromAuthority(auth, mUser.getIdentifier());
2262         }
2263     }
2264 }
2265