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