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