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