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