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