ContextImpl.java revision 48d0d1886731ff19ed3fb47a5997be5df0d1bba8
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 17package android.app; 18 19import com.android.internal.policy.PolicyManager; 20import com.android.internal.util.Preconditions; 21 22import android.bluetooth.BluetoothManager; 23import android.content.BroadcastReceiver; 24import android.content.ComponentName; 25import android.content.ContentResolver; 26import android.content.Context; 27import android.content.ContextWrapper; 28import android.content.IContentProvider; 29import android.content.Intent; 30import android.content.IntentFilter; 31import android.content.IIntentReceiver; 32import android.content.IntentSender; 33import android.content.ReceiverCallNotAllowedException; 34import android.content.ServiceConnection; 35import android.content.SharedPreferences; 36import android.content.pm.ApplicationInfo; 37import android.content.pm.IPackageManager; 38import android.content.pm.PackageManager; 39import android.content.pm.PackageManager.NameNotFoundException; 40import android.content.res.AssetManager; 41import android.content.res.CompatibilityInfo; 42import android.content.res.Configuration; 43import android.content.res.Resources; 44import android.database.DatabaseErrorHandler; 45import android.database.sqlite.SQLiteDatabase; 46import android.database.sqlite.SQLiteDatabase.CursorFactory; 47import android.graphics.Bitmap; 48import android.graphics.drawable.Drawable; 49import android.hardware.ISerialManager; 50import android.hardware.SerialManager; 51import android.hardware.SystemSensorManager; 52import android.hardware.photography.CameraManager; 53import android.hardware.display.DisplayManager; 54import android.hardware.input.InputManager; 55import android.hardware.usb.IUsbManager; 56import android.hardware.usb.UsbManager; 57import android.location.CountryDetector; 58import android.location.ICountryDetector; 59import android.location.ILocationManager; 60import android.location.LocationManager; 61import android.media.AudioManager; 62import android.media.MediaRouter; 63import android.net.ConnectivityManager; 64import android.net.IConnectivityManager; 65import android.net.INetworkPolicyManager; 66import android.net.NetworkPolicyManager; 67import android.net.Uri; 68import android.net.nsd.INsdManager; 69import android.net.nsd.NsdManager; 70import android.net.wifi.IWifiManager; 71import android.net.wifi.WifiManager; 72import android.net.wifi.p2p.IWifiP2pManager; 73import android.net.wifi.p2p.WifiP2pManager; 74import android.nfc.NfcManager; 75import android.os.Binder; 76import android.os.Bundle; 77import android.os.Debug; 78import android.os.DropBoxManager; 79import android.os.Environment; 80import android.os.FileUtils; 81import android.os.Handler; 82import android.os.IBinder; 83import android.os.IPowerManager; 84import android.os.IUserManager; 85import android.os.Looper; 86import android.os.PowerManager; 87import android.os.Process; 88import android.os.RemoteException; 89import android.os.ServiceManager; 90import android.os.UserHandle; 91import android.os.SystemVibrator; 92import android.os.UserManager; 93import android.os.storage.StorageManager; 94import android.telephony.TelephonyManager; 95import android.content.ClipboardManager; 96import android.util.AndroidRuntimeException; 97import android.util.ArrayMap; 98import android.util.Log; 99import android.util.Slog; 100import android.view.DisplayAdjustments; 101import android.view.ContextThemeWrapper; 102import android.view.Display; 103import android.view.WindowManagerImpl; 104import android.view.accessibility.AccessibilityManager; 105import android.view.inputmethod.InputMethodManager; 106import android.view.textservice.TextServicesManager; 107import android.accounts.AccountManager; 108import android.accounts.IAccountManager; 109import android.app.admin.DevicePolicyManager; 110 111import com.android.internal.app.IAppOpsService; 112import com.android.internal.os.IDropBoxManagerService; 113 114import java.io.File; 115import java.io.FileInputStream; 116import java.io.FileNotFoundException; 117import java.io.FileOutputStream; 118import java.io.IOException; 119import java.io.InputStream; 120import java.util.ArrayList; 121import java.util.HashMap; 122 123class ReceiverRestrictedContext extends ContextWrapper { 124 ReceiverRestrictedContext(Context base) { 125 super(base); 126 } 127 128 @Override 129 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 130 return registerReceiver(receiver, filter, null, null); 131 } 132 133 @Override 134 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 135 String broadcastPermission, Handler scheduler) { 136 if (receiver == null) { 137 // Allow retrieving current sticky broadcast; this is safe since we 138 // aren't actually registering a receiver. 139 return super.registerReceiver(null, filter, broadcastPermission, scheduler); 140 } else { 141 throw new ReceiverCallNotAllowedException( 142 "BroadcastReceiver components are not allowed to register to receive intents"); 143 } 144 } 145 146 @Override 147 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 148 IntentFilter filter, String broadcastPermission, Handler scheduler) { 149 if (receiver == null) { 150 // Allow retrieving current sticky broadcast; this is safe since we 151 // aren't actually registering a receiver. 152 return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler); 153 } else { 154 throw new ReceiverCallNotAllowedException( 155 "BroadcastReceiver components are not allowed to register to receive intents"); 156 } 157 } 158 159 @Override 160 public boolean bindService(Intent service, ServiceConnection conn, int flags) { 161 throw new ReceiverCallNotAllowedException( 162 "BroadcastReceiver components are not allowed to bind to services"); 163 } 164} 165 166/** 167 * Common implementation of Context API, which provides the base 168 * context object for Activity and other application components. 169 */ 170class ContextImpl extends Context { 171 private final static String TAG = "ContextImpl"; 172 private final static boolean DEBUG = false; 173 174 /** 175 * Map from package name, to preference name, to cached preferences. 176 */ 177 private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs; 178 179 /*package*/ LoadedApk mPackageInfo; 180 private String mBasePackageName; 181 private Resources mResources; 182 /*package*/ ActivityThread mMainThread; 183 private Context mOuterContext; 184 private IBinder mActivityToken = null; 185 private ApplicationContentResolver mContentResolver; 186 private int mThemeResource = 0; 187 private Resources.Theme mTheme = null; 188 private PackageManager mPackageManager; 189 private Display mDisplay; // may be null if default display 190 private Context mReceiverRestrictedContext = null; 191 private boolean mRestricted; 192 private UserHandle mUser; 193 194 private final Object mSync = new Object(); 195 196 private File mDatabasesDir; 197 private File mPreferencesDir; 198 private File mFilesDir; 199 private File mCacheDir; 200 private File mObbDir; 201 private File mExternalFilesDir; 202 private File mExternalCacheDir; 203 204 private static final String[] EMPTY_FILE_LIST = {}; 205 206 final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); 207 208 /** 209 * Override this class when the system service constructor needs a 210 * ContextImpl. Else, use StaticServiceFetcher below. 211 */ 212 /*package*/ static class ServiceFetcher { 213 int mContextCacheIndex = -1; 214 215 /** 216 * Main entrypoint; only override if you don't need caching. 217 */ 218 public Object getService(ContextImpl ctx) { 219 ArrayList<Object> cache = ctx.mServiceCache; 220 Object service; 221 synchronized (cache) { 222 if (cache.size() == 0) { 223 // Initialize the cache vector on first access. 224 // At this point sNextPerContextServiceCacheIndex 225 // is the number of potential services that are 226 // cached per-Context. 227 for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { 228 cache.add(null); 229 } 230 } else { 231 service = cache.get(mContextCacheIndex); 232 if (service != null) { 233 return service; 234 } 235 } 236 service = createService(ctx); 237 cache.set(mContextCacheIndex, service); 238 return service; 239 } 240 } 241 242 /** 243 * Override this to create a new per-Context instance of the 244 * service. getService() will handle locking and caching. 245 */ 246 public Object createService(ContextImpl ctx) { 247 throw new RuntimeException("Not implemented"); 248 } 249 } 250 251 /** 252 * Override this class for services to be cached process-wide. 253 */ 254 abstract static class StaticServiceFetcher extends ServiceFetcher { 255 private Object mCachedInstance; 256 257 @Override 258 public final Object getService(ContextImpl unused) { 259 synchronized (StaticServiceFetcher.this) { 260 Object service = mCachedInstance; 261 if (service != null) { 262 return service; 263 } 264 return mCachedInstance = createStaticService(); 265 } 266 } 267 268 public abstract Object createStaticService(); 269 } 270 271 private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP = 272 new HashMap<String, ServiceFetcher>(); 273 274 private static int sNextPerContextServiceCacheIndex = 0; 275 private static void registerService(String serviceName, ServiceFetcher fetcher) { 276 if (!(fetcher instanceof StaticServiceFetcher)) { 277 fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++; 278 } 279 SYSTEM_SERVICE_MAP.put(serviceName, fetcher); 280 } 281 282 // This one's defined separately and given a variable name so it 283 // can be re-used by getWallpaperManager(), avoiding a HashMap 284 // lookup. 285 private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() { 286 public Object createService(ContextImpl ctx) { 287 return new WallpaperManager(ctx.getOuterContext(), 288 ctx.mMainThread.getHandler()); 289 }}; 290 291 static { 292 registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { 293 public Object getService(ContextImpl ctx) { 294 return AccessibilityManager.getInstance(ctx); 295 }}); 296 297 registerService(ACCOUNT_SERVICE, new ServiceFetcher() { 298 public Object createService(ContextImpl ctx) { 299 IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); 300 IAccountManager service = IAccountManager.Stub.asInterface(b); 301 return new AccountManager(ctx, service); 302 }}); 303 304 registerService(ACTIVITY_SERVICE, new ServiceFetcher() { 305 public Object createService(ContextImpl ctx) { 306 return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); 307 }}); 308 309 registerService(ALARM_SERVICE, new StaticServiceFetcher() { 310 public Object createStaticService() { 311 IBinder b = ServiceManager.getService(ALARM_SERVICE); 312 IAlarmManager service = IAlarmManager.Stub.asInterface(b); 313 return new AlarmManager(service); 314 }}); 315 316 registerService(AUDIO_SERVICE, new ServiceFetcher() { 317 public Object createService(ContextImpl ctx) { 318 return new AudioManager(ctx); 319 }}); 320 321 registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() { 322 public Object createService(ContextImpl ctx) { 323 return new MediaRouter(ctx); 324 }}); 325 326 registerService(BLUETOOTH_SERVICE, new ServiceFetcher() { 327 public Object createService(ContextImpl ctx) { 328 return new BluetoothManager(ctx); 329 }}); 330 331 registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { 332 public Object createService(ContextImpl ctx) { 333 return new ClipboardManager(ctx.getOuterContext(), 334 ctx.mMainThread.getHandler()); 335 }}); 336 337 registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() { 338 public Object createStaticService() { 339 IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); 340 return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); 341 }}); 342 343 registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { 344 public Object createStaticService() { 345 IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); 346 return new CountryDetector(ICountryDetector.Stub.asInterface(b)); 347 }}); 348 349 registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { 350 public Object createService(ContextImpl ctx) { 351 return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); 352 }}); 353 354 registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { 355 public Object createService(ContextImpl ctx) { 356 return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); 357 }}); 358 359 registerService(NFC_SERVICE, new ServiceFetcher() { 360 public Object createService(ContextImpl ctx) { 361 return new NfcManager(ctx); 362 }}); 363 364 registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { 365 public Object createStaticService() { 366 return createDropBoxManager(); 367 }}); 368 369 registerService(INPUT_SERVICE, new StaticServiceFetcher() { 370 public Object createStaticService() { 371 return InputManager.getInstance(); 372 }}); 373 374 registerService(DISPLAY_SERVICE, new ServiceFetcher() { 375 @Override 376 public Object createService(ContextImpl ctx) { 377 return new DisplayManager(ctx.getOuterContext()); 378 }}); 379 380 registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() { 381 public Object createStaticService() { 382 return InputMethodManager.getInstance(); 383 }}); 384 385 registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() { 386 public Object createService(ContextImpl ctx) { 387 return TextServicesManager.getInstance(); 388 }}); 389 390 registerService(KEYGUARD_SERVICE, new ServiceFetcher() { 391 public Object getService(ContextImpl ctx) { 392 // TODO: why isn't this caching it? It wasn't 393 // before, so I'm preserving the old behavior and 394 // using getService(), instead of createService() 395 // which would do the caching. 396 return new KeyguardManager(); 397 }}); 398 399 registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { 400 public Object createService(ContextImpl ctx) { 401 return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); 402 }}); 403 404 registerService(LOCATION_SERVICE, new ServiceFetcher() { 405 public Object createService(ContextImpl ctx) { 406 IBinder b = ServiceManager.getService(LOCATION_SERVICE); 407 return new LocationManager(ctx, ILocationManager.Stub.asInterface(b)); 408 }}); 409 410 registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() { 411 @Override 412 public Object createService(ContextImpl ctx) { 413 return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface( 414 ServiceManager.getService(NETWORK_POLICY_SERVICE))); 415 } 416 }); 417 418 registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { 419 public Object createService(ContextImpl ctx) { 420 final Context outerContext = ctx.getOuterContext(); 421 return new NotificationManager( 422 new ContextThemeWrapper(outerContext, 423 Resources.selectSystemTheme(0, 424 outerContext.getApplicationInfo().targetSdkVersion, 425 com.android.internal.R.style.Theme_Dialog, 426 com.android.internal.R.style.Theme_Holo_Dialog, 427 com.android.internal.R.style.Theme_DeviceDefault_Dialog)), 428 ctx.mMainThread.getHandler()); 429 }}); 430 431 registerService(NSD_SERVICE, new ServiceFetcher() { 432 @Override 433 public Object createService(ContextImpl ctx) { 434 IBinder b = ServiceManager.getService(NSD_SERVICE); 435 INsdManager service = INsdManager.Stub.asInterface(b); 436 return new NsdManager(ctx.getOuterContext(), service); 437 }}); 438 439 // Note: this was previously cached in a static variable, but 440 // constructed using mMainThread.getHandler(), so converting 441 // it to be a regular Context-cached service... 442 registerService(POWER_SERVICE, new ServiceFetcher() { 443 public Object createService(ContextImpl ctx) { 444 IBinder b = ServiceManager.getService(POWER_SERVICE); 445 IPowerManager service = IPowerManager.Stub.asInterface(b); 446 return new PowerManager(ctx.getOuterContext(), 447 service, ctx.mMainThread.getHandler()); 448 }}); 449 450 registerService(SEARCH_SERVICE, new ServiceFetcher() { 451 public Object createService(ContextImpl ctx) { 452 return new SearchManager(ctx.getOuterContext(), 453 ctx.mMainThread.getHandler()); 454 }}); 455 456 registerService(SENSOR_SERVICE, new ServiceFetcher() { 457 public Object createService(ContextImpl ctx) { 458 return new SystemSensorManager(ctx.getOuterContext(), 459 ctx.mMainThread.getHandler().getLooper()); 460 }}); 461 462 registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { 463 public Object createService(ContextImpl ctx) { 464 return new StatusBarManager(ctx.getOuterContext()); 465 }}); 466 467 registerService(STORAGE_SERVICE, new ServiceFetcher() { 468 public Object createService(ContextImpl ctx) { 469 try { 470 return new StorageManager( 471 ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper()); 472 } catch (RemoteException rex) { 473 Log.e(TAG, "Failed to create StorageManager", rex); 474 return null; 475 } 476 }}); 477 478 registerService(TELEPHONY_SERVICE, new ServiceFetcher() { 479 public Object createService(ContextImpl ctx) { 480 return new TelephonyManager(ctx.getOuterContext()); 481 }}); 482 483 registerService(UI_MODE_SERVICE, new ServiceFetcher() { 484 public Object createService(ContextImpl ctx) { 485 return new UiModeManager(); 486 }}); 487 488 registerService(USB_SERVICE, new ServiceFetcher() { 489 public Object createService(ContextImpl ctx) { 490 IBinder b = ServiceManager.getService(USB_SERVICE); 491 return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); 492 }}); 493 494 registerService(SERIAL_SERVICE, new ServiceFetcher() { 495 public Object createService(ContextImpl ctx) { 496 IBinder b = ServiceManager.getService(SERIAL_SERVICE); 497 return new SerialManager(ctx, ISerialManager.Stub.asInterface(b)); 498 }}); 499 500 registerService(VIBRATOR_SERVICE, new ServiceFetcher() { 501 public Object createService(ContextImpl ctx) { 502 return new SystemVibrator(ctx); 503 }}); 504 505 registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER); 506 507 registerService(WIFI_SERVICE, new ServiceFetcher() { 508 public Object createService(ContextImpl ctx) { 509 IBinder b = ServiceManager.getService(WIFI_SERVICE); 510 IWifiManager service = IWifiManager.Stub.asInterface(b); 511 return new WifiManager(ctx.getOuterContext(), service); 512 }}); 513 514 registerService(WIFI_P2P_SERVICE, new ServiceFetcher() { 515 public Object createService(ContextImpl ctx) { 516 IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE); 517 IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); 518 return new WifiP2pManager(service); 519 }}); 520 521 registerService(WINDOW_SERVICE, new ServiceFetcher() { 522 Display mDefaultDisplay; 523 public Object getService(ContextImpl ctx) { 524 Display display = ctx.mDisplay; 525 if (display == null) { 526 if (mDefaultDisplay == null) { 527 DisplayManager dm = (DisplayManager)ctx.getOuterContext(). 528 getSystemService(Context.DISPLAY_SERVICE); 529 mDefaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY); 530 } 531 display = mDefaultDisplay; 532 } 533 return new WindowManagerImpl(display); 534 }}); 535 536 registerService(USER_SERVICE, new ServiceFetcher() { 537 public Object createService(ContextImpl ctx) { 538 IBinder b = ServiceManager.getService(USER_SERVICE); 539 IUserManager service = IUserManager.Stub.asInterface(b); 540 return new UserManager(ctx, service); 541 }}); 542 543 registerService(APP_OPS_SERVICE, new ServiceFetcher() { 544 public Object createService(ContextImpl ctx) { 545 IBinder b = ServiceManager.getService(APP_OPS_SERVICE); 546 IAppOpsService service = IAppOpsService.Stub.asInterface(b); 547 return new AppOpsManager(ctx, service); 548 }}); 549 550 registerService(CAMERA_SERVICE, new StaticServiceFetcher() { 551 public Object createStaticService() { 552 return new CameraManager(); 553 }}); 554 } 555 556 static ContextImpl getImpl(Context context) { 557 Context nextContext; 558 while ((context instanceof ContextWrapper) && 559 (nextContext=((ContextWrapper)context).getBaseContext()) != null) { 560 context = nextContext; 561 } 562 return (ContextImpl)context; 563 } 564 565 // The system service cache for the system services that are 566 // cached per-ContextImpl. Package-scoped to avoid accessor 567 // methods. 568 final ArrayList<Object> mServiceCache = new ArrayList<Object>(); 569 570 @Override 571 public AssetManager getAssets() { 572 return getResources().getAssets(); 573 } 574 575 @Override 576 public Resources getResources() { 577 return mResources; 578 } 579 580 @Override 581 public PackageManager getPackageManager() { 582 if (mPackageManager != null) { 583 return mPackageManager; 584 } 585 586 IPackageManager pm = ActivityThread.getPackageManager(); 587 if (pm != null) { 588 // Doesn't matter if we make more than one instance. 589 return (mPackageManager = new ApplicationPackageManager(this, pm)); 590 } 591 592 return null; 593 } 594 595 @Override 596 public ContentResolver getContentResolver() { 597 return mContentResolver; 598 } 599 600 @Override 601 public Looper getMainLooper() { 602 return mMainThread.getLooper(); 603 } 604 605 @Override 606 public Context getApplicationContext() { 607 return (mPackageInfo != null) ? 608 mPackageInfo.getApplication() : mMainThread.getApplication(); 609 } 610 611 @Override 612 public void setTheme(int resid) { 613 mThemeResource = resid; 614 } 615 616 @Override 617 public int getThemeResId() { 618 return mThemeResource; 619 } 620 621 @Override 622 public Resources.Theme getTheme() { 623 if (mTheme == null) { 624 mThemeResource = Resources.selectDefaultTheme(mThemeResource, 625 getOuterContext().getApplicationInfo().targetSdkVersion); 626 mTheme = mResources.newTheme(); 627 mTheme.applyStyle(mThemeResource, true); 628 } 629 return mTheme; 630 } 631 632 @Override 633 public ClassLoader getClassLoader() { 634 return mPackageInfo != null ? 635 mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); 636 } 637 638 @Override 639 public String getPackageName() { 640 if (mPackageInfo != null) { 641 return mPackageInfo.getPackageName(); 642 } 643 // No mPackageInfo means this is a Context for the system itself, 644 // and this here is its name. 645 return "android"; 646 } 647 648 /** @hide */ 649 @Override 650 public String getBasePackageName() { 651 return mBasePackageName != null ? mBasePackageName : getPackageName(); 652 } 653 654 @Override 655 public ApplicationInfo getApplicationInfo() { 656 if (mPackageInfo != null) { 657 return mPackageInfo.getApplicationInfo(); 658 } 659 throw new RuntimeException("Not supported in system context"); 660 } 661 662 @Override 663 public String getPackageResourcePath() { 664 if (mPackageInfo != null) { 665 return mPackageInfo.getResDir(); 666 } 667 throw new RuntimeException("Not supported in system context"); 668 } 669 670 @Override 671 public String getPackageCodePath() { 672 if (mPackageInfo != null) { 673 return mPackageInfo.getAppDir(); 674 } 675 throw new RuntimeException("Not supported in system context"); 676 } 677 678 public File getSharedPrefsFile(String name) { 679 return makeFilename(getPreferencesDir(), name + ".xml"); 680 } 681 682 @Override 683 public SharedPreferences getSharedPreferences(String name, int mode) { 684 SharedPreferencesImpl sp; 685 synchronized (mSync) { 686 if (sSharedPrefs == null) { 687 sSharedPrefs = new ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>(); 688 } 689 690 final String packageName = getPackageName(); 691 ArrayMap<String, SharedPreferencesImpl> packagePrefs = sSharedPrefs.get(packageName); 692 if (packagePrefs == null) { 693 packagePrefs = new ArrayMap<String, SharedPreferencesImpl>(); 694 sSharedPrefs.put(packageName, packagePrefs); 695 } 696 697 sp = packagePrefs.get(name); 698 if (sp == null) { 699 File prefsFile = getSharedPrefsFile(name); 700 sp = new SharedPreferencesImpl(prefsFile, mode); 701 packagePrefs.put(name, sp); 702 return sp; 703 } 704 } 705 if ((mode & Context.MODE_MULTI_PROCESS) != 0 || 706 getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 707 // If somebody else (some other process) changed the prefs 708 // file behind our back, we reload it. This has been the 709 // historical (if undocumented) behavior. 710 sp.startReloadIfChangedUnexpectedly(); 711 } 712 return sp; 713 } 714 715 private File getPreferencesDir() { 716 synchronized (mSync) { 717 if (mPreferencesDir == null) { 718 mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 719 } 720 return mPreferencesDir; 721 } 722 } 723 724 @Override 725 public FileInputStream openFileInput(String name) 726 throws FileNotFoundException { 727 File f = makeFilename(getFilesDir(), name); 728 return new FileInputStream(f); 729 } 730 731 @Override 732 public FileOutputStream openFileOutput(String name, int mode) 733 throws FileNotFoundException { 734 final boolean append = (mode&MODE_APPEND) != 0; 735 File f = makeFilename(getFilesDir(), name); 736 try { 737 FileOutputStream fos = new FileOutputStream(f, append); 738 setFilePermissionsFromMode(f.getPath(), mode, 0); 739 return fos; 740 } catch (FileNotFoundException e) { 741 } 742 743 File parent = f.getParentFile(); 744 parent.mkdir(); 745 FileUtils.setPermissions( 746 parent.getPath(), 747 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 748 -1, -1); 749 FileOutputStream fos = new FileOutputStream(f, append); 750 setFilePermissionsFromMode(f.getPath(), mode, 0); 751 return fos; 752 } 753 754 @Override 755 public boolean deleteFile(String name) { 756 File f = makeFilename(getFilesDir(), name); 757 return f.delete(); 758 } 759 760 @Override 761 public File getFilesDir() { 762 synchronized (mSync) { 763 if (mFilesDir == null) { 764 mFilesDir = new File(getDataDirFile(), "files"); 765 } 766 if (!mFilesDir.exists()) { 767 if(!mFilesDir.mkdirs()) { 768 Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath()); 769 return null; 770 } 771 FileUtils.setPermissions( 772 mFilesDir.getPath(), 773 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 774 -1, -1); 775 } 776 return mFilesDir; 777 } 778 } 779 780 @Override 781 public File getExternalFilesDir(String type) { 782 synchronized (mSync) { 783 if (mExternalFilesDir == null) { 784 mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory( 785 getPackageName()); 786 } 787 if (!mExternalFilesDir.exists()) { 788 try { 789 (new File(Environment.getExternalStorageAndroidDataDir(), 790 ".nomedia")).createNewFile(); 791 } catch (IOException e) { 792 } 793 if (!mExternalFilesDir.mkdirs()) { 794 Log.w(TAG, "Unable to create external files directory"); 795 return null; 796 } 797 } 798 if (type == null) { 799 return mExternalFilesDir; 800 } 801 File dir = new File(mExternalFilesDir, type); 802 if (!dir.exists()) { 803 if (!dir.mkdirs()) { 804 Log.w(TAG, "Unable to create external media directory " + dir); 805 return null; 806 } 807 } 808 return dir; 809 } 810 } 811 812 @Override 813 public File getObbDir() { 814 synchronized (mSync) { 815 if (mObbDir == null) { 816 mObbDir = Environment.getExternalStorageAppObbDirectory( 817 getPackageName()); 818 } 819 return mObbDir; 820 } 821 } 822 823 @Override 824 public File getCacheDir() { 825 synchronized (mSync) { 826 if (mCacheDir == null) { 827 mCacheDir = new File(getDataDirFile(), "cache"); 828 } 829 if (!mCacheDir.exists()) { 830 if(!mCacheDir.mkdirs()) { 831 Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath()); 832 return null; 833 } 834 FileUtils.setPermissions( 835 mCacheDir.getPath(), 836 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 837 -1, -1); 838 } 839 } 840 return mCacheDir; 841 } 842 843 @Override 844 public File getExternalCacheDir() { 845 synchronized (mSync) { 846 if (mExternalCacheDir == null) { 847 mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory( 848 getPackageName()); 849 } 850 if (!mExternalCacheDir.exists()) { 851 try { 852 (new File(Environment.getExternalStorageAndroidDataDir(), 853 ".nomedia")).createNewFile(); 854 } catch (IOException e) { 855 } 856 if (!mExternalCacheDir.mkdirs()) { 857 Log.w(TAG, "Unable to create external cache directory"); 858 return null; 859 } 860 } 861 return mExternalCacheDir; 862 } 863 } 864 865 @Override 866 public File getFileStreamPath(String name) { 867 return makeFilename(getFilesDir(), name); 868 } 869 870 @Override 871 public String[] fileList() { 872 final String[] list = getFilesDir().list(); 873 return (list != null) ? list : EMPTY_FILE_LIST; 874 } 875 876 @Override 877 public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { 878 return openOrCreateDatabase(name, mode, factory, null); 879 } 880 881 @Override 882 public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, 883 DatabaseErrorHandler errorHandler) { 884 File f = validateFilePath(name, true); 885 int flags = SQLiteDatabase.CREATE_IF_NECESSARY; 886 if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) { 887 flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING; 888 } 889 SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler); 890 setFilePermissionsFromMode(f.getPath(), mode, 0); 891 return db; 892 } 893 894 @Override 895 public boolean deleteDatabase(String name) { 896 try { 897 File f = validateFilePath(name, false); 898 return SQLiteDatabase.deleteDatabase(f); 899 } catch (Exception e) { 900 } 901 return false; 902 } 903 904 @Override 905 public File getDatabasePath(String name) { 906 return validateFilePath(name, false); 907 } 908 909 @Override 910 public String[] databaseList() { 911 final String[] list = getDatabasesDir().list(); 912 return (list != null) ? list : EMPTY_FILE_LIST; 913 } 914 915 916 private File getDatabasesDir() { 917 synchronized (mSync) { 918 if (mDatabasesDir == null) { 919 mDatabasesDir = new File(getDataDirFile(), "databases"); 920 } 921 if (mDatabasesDir.getPath().equals("databases")) { 922 mDatabasesDir = new File("/data/system"); 923 } 924 return mDatabasesDir; 925 } 926 } 927 928 @Override 929 public Drawable getWallpaper() { 930 return getWallpaperManager().getDrawable(); 931 } 932 933 @Override 934 public Drawable peekWallpaper() { 935 return getWallpaperManager().peekDrawable(); 936 } 937 938 @Override 939 public int getWallpaperDesiredMinimumWidth() { 940 return getWallpaperManager().getDesiredMinimumWidth(); 941 } 942 943 @Override 944 public int getWallpaperDesiredMinimumHeight() { 945 return getWallpaperManager().getDesiredMinimumHeight(); 946 } 947 948 @Override 949 public void setWallpaper(Bitmap bitmap) throws IOException { 950 getWallpaperManager().setBitmap(bitmap); 951 } 952 953 @Override 954 public void setWallpaper(InputStream data) throws IOException { 955 getWallpaperManager().setStream(data); 956 } 957 958 @Override 959 public void clearWallpaper() throws IOException { 960 getWallpaperManager().clear(); 961 } 962 963 @Override 964 public void startActivity(Intent intent) { 965 warnIfCallingFromSystemProcess(); 966 startActivity(intent, null); 967 } 968 969 /** @hide */ 970 @Override 971 public void startActivityAsUser(Intent intent, UserHandle user) { 972 startActivityAsUser(intent, null, user); 973 } 974 975 @Override 976 public void startActivity(Intent intent, Bundle options) { 977 warnIfCallingFromSystemProcess(); 978 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 979 throw new AndroidRuntimeException( 980 "Calling startActivity() from outside of an Activity " 981 + " context requires the FLAG_ACTIVITY_NEW_TASK flag." 982 + " Is this really what you want?"); 983 } 984 mMainThread.getInstrumentation().execStartActivity( 985 getOuterContext(), mMainThread.getApplicationThread(), null, 986 (Activity)null, intent, -1, options); 987 } 988 989 /** @hide */ 990 @Override 991 public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) { 992 try { 993 ActivityManagerNative.getDefault().startActivityAsUser( 994 mMainThread.getApplicationThread(), getBasePackageName(), intent, 995 intent.resolveTypeIfNeeded(getContentResolver()), 996 null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options, 997 user.getIdentifier()); 998 } catch (RemoteException re) { 999 } 1000 } 1001 1002 @Override 1003 public void startActivities(Intent[] intents) { 1004 warnIfCallingFromSystemProcess(); 1005 startActivities(intents, null); 1006 } 1007 1008 /** @hide */ 1009 @Override 1010 public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) { 1011 if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1012 throw new AndroidRuntimeException( 1013 "Calling startActivities() from outside of an Activity " 1014 + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 1015 + " Is this really what you want?"); 1016 } 1017 mMainThread.getInstrumentation().execStartActivitiesAsUser( 1018 getOuterContext(), mMainThread.getApplicationThread(), null, 1019 (Activity)null, intents, options, userHandle.getIdentifier()); 1020 } 1021 1022 @Override 1023 public void startActivities(Intent[] intents, Bundle options) { 1024 warnIfCallingFromSystemProcess(); 1025 if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1026 throw new AndroidRuntimeException( 1027 "Calling startActivities() from outside of an Activity " 1028 + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 1029 + " Is this really what you want?"); 1030 } 1031 mMainThread.getInstrumentation().execStartActivities( 1032 getOuterContext(), mMainThread.getApplicationThread(), null, 1033 (Activity)null, intents, options); 1034 } 1035 1036 @Override 1037 public void startIntentSender(IntentSender intent, 1038 Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 1039 throws IntentSender.SendIntentException { 1040 startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null); 1041 } 1042 1043 @Override 1044 public void startIntentSender(IntentSender intent, Intent fillInIntent, 1045 int flagsMask, int flagsValues, int extraFlags, Bundle options) 1046 throws IntentSender.SendIntentException { 1047 try { 1048 String resolvedType = null; 1049 if (fillInIntent != null) { 1050 fillInIntent.migrateExtraStreamToClipData(); 1051 fillInIntent.prepareToLeaveProcess(); 1052 resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); 1053 } 1054 int result = ActivityManagerNative.getDefault() 1055 .startActivityIntentSender(mMainThread.getApplicationThread(), intent, 1056 fillInIntent, resolvedType, null, null, 1057 0, flagsMask, flagsValues, options); 1058 if (result == ActivityManager.START_CANCELED) { 1059 throw new IntentSender.SendIntentException(); 1060 } 1061 Instrumentation.checkStartActivityResult(result, null); 1062 } catch (RemoteException e) { 1063 } 1064 } 1065 1066 @Override 1067 public void sendBroadcast(Intent intent) { 1068 warnIfCallingFromSystemProcess(); 1069 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1070 try { 1071 intent.prepareToLeaveProcess(); 1072 ActivityManagerNative.getDefault().broadcastIntent( 1073 mMainThread.getApplicationThread(), intent, resolvedType, null, 1074 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false, 1075 getUserId()); 1076 } catch (RemoteException e) { 1077 } 1078 } 1079 1080 @Override 1081 public void sendBroadcast(Intent intent, String receiverPermission) { 1082 warnIfCallingFromSystemProcess(); 1083 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1084 try { 1085 intent.prepareToLeaveProcess(); 1086 ActivityManagerNative.getDefault().broadcastIntent( 1087 mMainThread.getApplicationThread(), intent, resolvedType, null, 1088 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, 1089 false, false, getUserId()); 1090 } catch (RemoteException e) { 1091 } 1092 } 1093 1094 @Override 1095 public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { 1096 warnIfCallingFromSystemProcess(); 1097 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1098 try { 1099 intent.prepareToLeaveProcess(); 1100 ActivityManagerNative.getDefault().broadcastIntent( 1101 mMainThread.getApplicationThread(), intent, resolvedType, null, 1102 Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false, 1103 getUserId()); 1104 } catch (RemoteException e) { 1105 } 1106 } 1107 1108 @Override 1109 public void sendOrderedBroadcast(Intent intent, 1110 String receiverPermission) { 1111 warnIfCallingFromSystemProcess(); 1112 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1113 try { 1114 intent.prepareToLeaveProcess(); 1115 ActivityManagerNative.getDefault().broadcastIntent( 1116 mMainThread.getApplicationThread(), intent, resolvedType, null, 1117 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false, 1118 getUserId()); 1119 } catch (RemoteException e) { 1120 } 1121 } 1122 1123 @Override 1124 public void sendOrderedBroadcast(Intent intent, 1125 String receiverPermission, BroadcastReceiver resultReceiver, 1126 Handler scheduler, int initialCode, String initialData, 1127 Bundle initialExtras) { 1128 sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE, 1129 resultReceiver, scheduler, initialCode, initialData, initialExtras); 1130 } 1131 1132 @Override 1133 public void sendOrderedBroadcast(Intent intent, 1134 String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 1135 Handler scheduler, int initialCode, String initialData, 1136 Bundle initialExtras) { 1137 warnIfCallingFromSystemProcess(); 1138 IIntentReceiver rd = null; 1139 if (resultReceiver != null) { 1140 if (mPackageInfo != null) { 1141 if (scheduler == null) { 1142 scheduler = mMainThread.getHandler(); 1143 } 1144 rd = mPackageInfo.getReceiverDispatcher( 1145 resultReceiver, getOuterContext(), scheduler, 1146 mMainThread.getInstrumentation(), false); 1147 } else { 1148 if (scheduler == null) { 1149 scheduler = mMainThread.getHandler(); 1150 } 1151 rd = new LoadedApk.ReceiverDispatcher( 1152 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1153 } 1154 } 1155 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1156 try { 1157 intent.prepareToLeaveProcess(); 1158 ActivityManagerNative.getDefault().broadcastIntent( 1159 mMainThread.getApplicationThread(), intent, resolvedType, rd, 1160 initialCode, initialData, initialExtras, receiverPermission, appOp, 1161 true, false, getUserId()); 1162 } catch (RemoteException e) { 1163 } 1164 } 1165 1166 @Override 1167 public void sendBroadcastAsUser(Intent intent, UserHandle user) { 1168 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1169 try { 1170 intent.prepareToLeaveProcess(); 1171 ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(), 1172 intent, resolvedType, null, Activity.RESULT_OK, null, null, null, 1173 AppOpsManager.OP_NONE, false, false, user.getIdentifier()); 1174 } catch (RemoteException e) { 1175 } 1176 } 1177 1178 @Override 1179 public void sendBroadcastAsUser(Intent intent, UserHandle user, 1180 String receiverPermission) { 1181 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1182 try { 1183 intent.prepareToLeaveProcess(); 1184 ActivityManagerNative.getDefault().broadcastIntent( 1185 mMainThread.getApplicationThread(), intent, resolvedType, null, 1186 Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false, 1187 user.getIdentifier()); 1188 } catch (RemoteException e) { 1189 } 1190 } 1191 1192 @Override 1193 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 1194 String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 1195 int initialCode, String initialData, Bundle initialExtras) { 1196 IIntentReceiver rd = null; 1197 if (resultReceiver != null) { 1198 if (mPackageInfo != null) { 1199 if (scheduler == null) { 1200 scheduler = mMainThread.getHandler(); 1201 } 1202 rd = mPackageInfo.getReceiverDispatcher( 1203 resultReceiver, getOuterContext(), scheduler, 1204 mMainThread.getInstrumentation(), false); 1205 } else { 1206 if (scheduler == null) { 1207 scheduler = mMainThread.getHandler(); 1208 } 1209 rd = new LoadedApk.ReceiverDispatcher( 1210 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1211 } 1212 } 1213 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1214 try { 1215 intent.prepareToLeaveProcess(); 1216 ActivityManagerNative.getDefault().broadcastIntent( 1217 mMainThread.getApplicationThread(), intent, resolvedType, rd, 1218 initialCode, initialData, initialExtras, receiverPermission, 1219 AppOpsManager.OP_NONE, true, false, user.getIdentifier()); 1220 } catch (RemoteException e) { 1221 } 1222 } 1223 1224 @Override 1225 public void sendStickyBroadcast(Intent intent) { 1226 warnIfCallingFromSystemProcess(); 1227 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1228 try { 1229 intent.prepareToLeaveProcess(); 1230 ActivityManagerNative.getDefault().broadcastIntent( 1231 mMainThread.getApplicationThread(), intent, resolvedType, null, 1232 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, 1233 getUserId()); 1234 } catch (RemoteException e) { 1235 } 1236 } 1237 1238 @Override 1239 public void sendStickyOrderedBroadcast(Intent intent, 1240 BroadcastReceiver resultReceiver, 1241 Handler scheduler, int initialCode, String initialData, 1242 Bundle initialExtras) { 1243 warnIfCallingFromSystemProcess(); 1244 IIntentReceiver rd = null; 1245 if (resultReceiver != null) { 1246 if (mPackageInfo != null) { 1247 if (scheduler == null) { 1248 scheduler = mMainThread.getHandler(); 1249 } 1250 rd = mPackageInfo.getReceiverDispatcher( 1251 resultReceiver, getOuterContext(), scheduler, 1252 mMainThread.getInstrumentation(), false); 1253 } else { 1254 if (scheduler == null) { 1255 scheduler = mMainThread.getHandler(); 1256 } 1257 rd = new LoadedApk.ReceiverDispatcher( 1258 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1259 } 1260 } 1261 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1262 try { 1263 intent.prepareToLeaveProcess(); 1264 ActivityManagerNative.getDefault().broadcastIntent( 1265 mMainThread.getApplicationThread(), intent, resolvedType, rd, 1266 initialCode, initialData, initialExtras, null, 1267 AppOpsManager.OP_NONE, true, true, getUserId()); 1268 } catch (RemoteException e) { 1269 } 1270 } 1271 1272 @Override 1273 public void removeStickyBroadcast(Intent intent) { 1274 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1275 if (resolvedType != null) { 1276 intent = new Intent(intent); 1277 intent.setDataAndType(intent.getData(), resolvedType); 1278 } 1279 try { 1280 intent.prepareToLeaveProcess(); 1281 ActivityManagerNative.getDefault().unbroadcastIntent( 1282 mMainThread.getApplicationThread(), intent, getUserId()); 1283 } catch (RemoteException e) { 1284 } 1285 } 1286 1287 @Override 1288 public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 1289 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1290 try { 1291 intent.prepareToLeaveProcess(); 1292 ActivityManagerNative.getDefault().broadcastIntent( 1293 mMainThread.getApplicationThread(), intent, resolvedType, null, 1294 Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier()); 1295 } catch (RemoteException e) { 1296 } 1297 } 1298 1299 @Override 1300 public void sendStickyOrderedBroadcastAsUser(Intent intent, 1301 UserHandle user, BroadcastReceiver resultReceiver, 1302 Handler scheduler, int initialCode, String initialData, 1303 Bundle initialExtras) { 1304 IIntentReceiver rd = null; 1305 if (resultReceiver != null) { 1306 if (mPackageInfo != null) { 1307 if (scheduler == null) { 1308 scheduler = mMainThread.getHandler(); 1309 } 1310 rd = mPackageInfo.getReceiverDispatcher( 1311 resultReceiver, getOuterContext(), scheduler, 1312 mMainThread.getInstrumentation(), false); 1313 } else { 1314 if (scheduler == null) { 1315 scheduler = mMainThread.getHandler(); 1316 } 1317 rd = new LoadedApk.ReceiverDispatcher( 1318 resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1319 } 1320 } 1321 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1322 try { 1323 intent.prepareToLeaveProcess(); 1324 ActivityManagerNative.getDefault().broadcastIntent( 1325 mMainThread.getApplicationThread(), intent, resolvedType, rd, 1326 initialCode, initialData, initialExtras, null, 1327 AppOpsManager.OP_NONE, true, true, user.getIdentifier()); 1328 } catch (RemoteException e) { 1329 } 1330 } 1331 1332 @Override 1333 public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { 1334 String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1335 if (resolvedType != null) { 1336 intent = new Intent(intent); 1337 intent.setDataAndType(intent.getData(), resolvedType); 1338 } 1339 try { 1340 intent.prepareToLeaveProcess(); 1341 ActivityManagerNative.getDefault().unbroadcastIntent( 1342 mMainThread.getApplicationThread(), intent, user.getIdentifier()); 1343 } catch (RemoteException e) { 1344 } 1345 } 1346 1347 @Override 1348 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1349 return registerReceiver(receiver, filter, null, null); 1350 } 1351 1352 @Override 1353 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1354 String broadcastPermission, Handler scheduler) { 1355 return registerReceiverInternal(receiver, getUserId(), 1356 filter, broadcastPermission, scheduler, getOuterContext()); 1357 } 1358 1359 @Override 1360 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 1361 IntentFilter filter, String broadcastPermission, Handler scheduler) { 1362 return registerReceiverInternal(receiver, user.getIdentifier(), 1363 filter, broadcastPermission, scheduler, getOuterContext()); 1364 } 1365 1366 private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId, 1367 IntentFilter filter, String broadcastPermission, 1368 Handler scheduler, Context context) { 1369 IIntentReceiver rd = null; 1370 if (receiver != null) { 1371 if (mPackageInfo != null && context != null) { 1372 if (scheduler == null) { 1373 scheduler = mMainThread.getHandler(); 1374 } 1375 rd = mPackageInfo.getReceiverDispatcher( 1376 receiver, context, scheduler, 1377 mMainThread.getInstrumentation(), true); 1378 } else { 1379 if (scheduler == null) { 1380 scheduler = mMainThread.getHandler(); 1381 } 1382 rd = new LoadedApk.ReceiverDispatcher( 1383 receiver, context, scheduler, null, true).getIIntentReceiver(); 1384 } 1385 } 1386 try { 1387 return ActivityManagerNative.getDefault().registerReceiver( 1388 mMainThread.getApplicationThread(), mBasePackageName, 1389 rd, filter, broadcastPermission, userId); 1390 } catch (RemoteException e) { 1391 return null; 1392 } 1393 } 1394 1395 @Override 1396 public void unregisterReceiver(BroadcastReceiver receiver) { 1397 if (mPackageInfo != null) { 1398 IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( 1399 getOuterContext(), receiver); 1400 try { 1401 ActivityManagerNative.getDefault().unregisterReceiver(rd); 1402 } catch (RemoteException e) { 1403 } 1404 } else { 1405 throw new RuntimeException("Not supported in system context"); 1406 } 1407 } 1408 1409 @Override 1410 public ComponentName startService(Intent service) { 1411 warnIfCallingFromSystemProcess(); 1412 return startServiceAsUser(service, mUser); 1413 } 1414 1415 @Override 1416 public boolean stopService(Intent service) { 1417 warnIfCallingFromSystemProcess(); 1418 return stopServiceAsUser(service, mUser); 1419 } 1420 1421 @Override 1422 public ComponentName startServiceAsUser(Intent service, UserHandle user) { 1423 try { 1424 service.prepareToLeaveProcess(); 1425 ComponentName cn = ActivityManagerNative.getDefault().startService( 1426 mMainThread.getApplicationThread(), service, 1427 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier()); 1428 if (cn != null) { 1429 if (cn.getPackageName().equals("!")) { 1430 throw new SecurityException( 1431 "Not allowed to start service " + service 1432 + " without permission " + cn.getClassName()); 1433 } else if (cn.getPackageName().equals("!!")) { 1434 throw new SecurityException( 1435 "Unable to start service " + service 1436 + ": " + cn.getClassName()); 1437 } 1438 } 1439 return cn; 1440 } catch (RemoteException e) { 1441 return null; 1442 } 1443 } 1444 1445 @Override 1446 public boolean stopServiceAsUser(Intent service, UserHandle user) { 1447 try { 1448 service.prepareToLeaveProcess(); 1449 int res = ActivityManagerNative.getDefault().stopService( 1450 mMainThread.getApplicationThread(), service, 1451 service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier()); 1452 if (res < 0) { 1453 throw new SecurityException( 1454 "Not allowed to stop service " + service); 1455 } 1456 return res != 0; 1457 } catch (RemoteException e) { 1458 return false; 1459 } 1460 } 1461 1462 @Override 1463 public boolean bindService(Intent service, ServiceConnection conn, 1464 int flags) { 1465 warnIfCallingFromSystemProcess(); 1466 return bindServiceAsUser(service, conn, flags, Process.myUserHandle()); 1467 } 1468 1469 /** @hide */ 1470 @Override 1471 public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags, 1472 UserHandle user) { 1473 IServiceConnection sd; 1474 if (conn == null) { 1475 throw new IllegalArgumentException("connection is null"); 1476 } 1477 if (mPackageInfo != null) { 1478 sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 1479 mMainThread.getHandler(), flags); 1480 } else { 1481 throw new RuntimeException("Not supported in system context"); 1482 } 1483 try { 1484 IBinder token = getActivityToken(); 1485 if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null 1486 && mPackageInfo.getApplicationInfo().targetSdkVersion 1487 < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 1488 flags |= BIND_WAIVE_PRIORITY; 1489 } 1490 service.prepareToLeaveProcess(); 1491 int res = ActivityManagerNative.getDefault().bindService( 1492 mMainThread.getApplicationThread(), getActivityToken(), 1493 service, service.resolveTypeIfNeeded(getContentResolver()), 1494 sd, flags, user.getIdentifier()); 1495 if (res < 0) { 1496 throw new SecurityException( 1497 "Not allowed to bind to service " + service); 1498 } 1499 return res != 0; 1500 } catch (RemoteException e) { 1501 return false; 1502 } 1503 } 1504 1505 @Override 1506 public void unbindService(ServiceConnection conn) { 1507 if (conn == null) { 1508 throw new IllegalArgumentException("connection is null"); 1509 } 1510 if (mPackageInfo != null) { 1511 IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( 1512 getOuterContext(), conn); 1513 try { 1514 ActivityManagerNative.getDefault().unbindService(sd); 1515 } catch (RemoteException e) { 1516 } 1517 } else { 1518 throw new RuntimeException("Not supported in system context"); 1519 } 1520 } 1521 1522 @Override 1523 public boolean startInstrumentation(ComponentName className, 1524 String profileFile, Bundle arguments) { 1525 try { 1526 if (arguments != null) { 1527 arguments.setAllowFds(false); 1528 } 1529 return ActivityManagerNative.getDefault().startInstrumentation( 1530 className, profileFile, 0, arguments, null, null, getUserId()); 1531 } catch (RemoteException e) { 1532 // System has crashed, nothing we can do. 1533 } 1534 return false; 1535 } 1536 1537 @Override 1538 public Object getSystemService(String name) { 1539 ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 1540 return fetcher == null ? null : fetcher.getService(this); 1541 } 1542 1543 private WallpaperManager getWallpaperManager() { 1544 return (WallpaperManager) WALLPAPER_FETCHER.getService(this); 1545 } 1546 1547 /* package */ static DropBoxManager createDropBoxManager() { 1548 IBinder b = ServiceManager.getService(DROPBOX_SERVICE); 1549 IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); 1550 if (service == null) { 1551 // Don't return a DropBoxManager that will NPE upon use. 1552 // This also avoids caching a broken DropBoxManager in 1553 // getDropBoxManager during early boot, before the 1554 // DROPBOX_SERVICE is registered. 1555 return null; 1556 } 1557 return new DropBoxManager(service); 1558 } 1559 1560 @Override 1561 public int checkPermission(String permission, int pid, int uid) { 1562 if (permission == null) { 1563 throw new IllegalArgumentException("permission is null"); 1564 } 1565 1566 try { 1567 return ActivityManagerNative.getDefault().checkPermission( 1568 permission, pid, uid); 1569 } catch (RemoteException e) { 1570 return PackageManager.PERMISSION_DENIED; 1571 } 1572 } 1573 1574 @Override 1575 public int checkCallingPermission(String permission) { 1576 if (permission == null) { 1577 throw new IllegalArgumentException("permission is null"); 1578 } 1579 1580 int pid = Binder.getCallingPid(); 1581 if (pid != Process.myPid()) { 1582 return checkPermission(permission, pid, Binder.getCallingUid()); 1583 } 1584 return PackageManager.PERMISSION_DENIED; 1585 } 1586 1587 @Override 1588 public int checkCallingOrSelfPermission(String permission) { 1589 if (permission == null) { 1590 throw new IllegalArgumentException("permission is null"); 1591 } 1592 1593 return checkPermission(permission, Binder.getCallingPid(), 1594 Binder.getCallingUid()); 1595 } 1596 1597 private void enforce( 1598 String permission, int resultOfCheck, 1599 boolean selfToo, int uid, String message) { 1600 if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 1601 throw new SecurityException( 1602 (message != null ? (message + ": ") : "") + 1603 (selfToo 1604 ? "Neither user " + uid + " nor current process has " 1605 : "uid " + uid + " does not have ") + 1606 permission + 1607 "."); 1608 } 1609 } 1610 1611 public void enforcePermission( 1612 String permission, int pid, int uid, String message) { 1613 enforce(permission, 1614 checkPermission(permission, pid, uid), 1615 false, 1616 uid, 1617 message); 1618 } 1619 1620 public void enforceCallingPermission(String permission, String message) { 1621 enforce(permission, 1622 checkCallingPermission(permission), 1623 false, 1624 Binder.getCallingUid(), 1625 message); 1626 } 1627 1628 public void enforceCallingOrSelfPermission( 1629 String permission, String message) { 1630 enforce(permission, 1631 checkCallingOrSelfPermission(permission), 1632 true, 1633 Binder.getCallingUid(), 1634 message); 1635 } 1636 1637 @Override 1638 public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { 1639 try { 1640 ActivityManagerNative.getDefault().grantUriPermission( 1641 mMainThread.getApplicationThread(), toPackage, uri, 1642 modeFlags); 1643 } catch (RemoteException e) { 1644 } 1645 } 1646 1647 @Override 1648 public void revokeUriPermission(Uri uri, int modeFlags) { 1649 try { 1650 ActivityManagerNative.getDefault().revokeUriPermission( 1651 mMainThread.getApplicationThread(), uri, 1652 modeFlags); 1653 } catch (RemoteException e) { 1654 } 1655 } 1656 1657 @Override 1658 public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { 1659 try { 1660 return ActivityManagerNative.getDefault().checkUriPermission( 1661 uri, pid, uid, modeFlags); 1662 } catch (RemoteException e) { 1663 return PackageManager.PERMISSION_DENIED; 1664 } 1665 } 1666 1667 @Override 1668 public int checkCallingUriPermission(Uri uri, int modeFlags) { 1669 int pid = Binder.getCallingPid(); 1670 if (pid != Process.myPid()) { 1671 return checkUriPermission(uri, pid, 1672 Binder.getCallingUid(), modeFlags); 1673 } 1674 return PackageManager.PERMISSION_DENIED; 1675 } 1676 1677 @Override 1678 public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { 1679 return checkUriPermission(uri, Binder.getCallingPid(), 1680 Binder.getCallingUid(), modeFlags); 1681 } 1682 1683 @Override 1684 public int checkUriPermission(Uri uri, String readPermission, 1685 String writePermission, int pid, int uid, int modeFlags) { 1686 if (DEBUG) { 1687 Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" 1688 + readPermission + " writePermission=" + writePermission 1689 + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); 1690 } 1691 if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 1692 if (readPermission == null 1693 || checkPermission(readPermission, pid, uid) 1694 == PackageManager.PERMISSION_GRANTED) { 1695 return PackageManager.PERMISSION_GRANTED; 1696 } 1697 } 1698 if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 1699 if (writePermission == null 1700 || checkPermission(writePermission, pid, uid) 1701 == PackageManager.PERMISSION_GRANTED) { 1702 return PackageManager.PERMISSION_GRANTED; 1703 } 1704 } 1705 return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) 1706 : PackageManager.PERMISSION_DENIED; 1707 } 1708 1709 private String uriModeFlagToString(int uriModeFlags) { 1710 switch (uriModeFlags) { 1711 case Intent.FLAG_GRANT_READ_URI_PERMISSION | 1712 Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 1713 return "read and write"; 1714 case Intent.FLAG_GRANT_READ_URI_PERMISSION: 1715 return "read"; 1716 case Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 1717 return "write"; 1718 } 1719 throw new IllegalArgumentException( 1720 "Unknown permission mode flags: " + uriModeFlags); 1721 } 1722 1723 private void enforceForUri( 1724 int modeFlags, int resultOfCheck, boolean selfToo, 1725 int uid, Uri uri, String message) { 1726 if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 1727 throw new SecurityException( 1728 (message != null ? (message + ": ") : "") + 1729 (selfToo 1730 ? "Neither user " + uid + " nor current process has " 1731 : "User " + uid + " does not have ") + 1732 uriModeFlagToString(modeFlags) + 1733 " permission on " + 1734 uri + 1735 "."); 1736 } 1737 } 1738 1739 public void enforceUriPermission( 1740 Uri uri, int pid, int uid, int modeFlags, String message) { 1741 enforceForUri( 1742 modeFlags, checkUriPermission(uri, pid, uid, modeFlags), 1743 false, uid, uri, message); 1744 } 1745 1746 public void enforceCallingUriPermission( 1747 Uri uri, int modeFlags, String message) { 1748 enforceForUri( 1749 modeFlags, checkCallingUriPermission(uri, modeFlags), 1750 false, 1751 Binder.getCallingUid(), uri, message); 1752 } 1753 1754 public void enforceCallingOrSelfUriPermission( 1755 Uri uri, int modeFlags, String message) { 1756 enforceForUri( 1757 modeFlags, 1758 checkCallingOrSelfUriPermission(uri, modeFlags), true, 1759 Binder.getCallingUid(), uri, message); 1760 } 1761 1762 public void enforceUriPermission( 1763 Uri uri, String readPermission, String writePermission, 1764 int pid, int uid, int modeFlags, String message) { 1765 enforceForUri(modeFlags, 1766 checkUriPermission( 1767 uri, readPermission, writePermission, pid, uid, 1768 modeFlags), 1769 false, 1770 uid, 1771 uri, 1772 message); 1773 } 1774 1775 private void warnIfCallingFromSystemProcess() { 1776 if (Process.myUid() == Process.SYSTEM_UID) { 1777 Slog.w(TAG, "Calling a method in the system process without a qualified user: " 1778 + Debug.getCallers(5)); 1779 } 1780 } 1781 1782 @Override 1783 public Context createPackageContext(String packageName, int flags) 1784 throws NameNotFoundException { 1785 return createPackageContextAsUser(packageName, flags, 1786 mUser != null ? mUser : Process.myUserHandle()); 1787 } 1788 1789 @Override 1790 public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 1791 throws NameNotFoundException { 1792 if (packageName.equals("system") || packageName.equals("android")) { 1793 final ContextImpl context = new ContextImpl(mMainThread.getSystemContext()); 1794 context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 1795 context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user); 1796 return context; 1797 } 1798 1799 LoadedApk pi = 1800 mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags, 1801 user.getIdentifier()); 1802 if (pi != null) { 1803 ContextImpl c = new ContextImpl(); 1804 c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 1805 c.init(pi, null, mMainThread, mResources, mBasePackageName, user); 1806 if (c.mResources != null) { 1807 return c; 1808 } 1809 } 1810 1811 // Should be a better exception. 1812 throw new PackageManager.NameNotFoundException( 1813 "Application package " + packageName + " not found"); 1814 } 1815 1816 @Override 1817 public Context createConfigurationContext(Configuration overrideConfiguration) { 1818 if (overrideConfiguration == null) { 1819 throw new IllegalArgumentException("overrideConfiguration must not be null"); 1820 } 1821 1822 ContextImpl c = new ContextImpl(); 1823 c.init(mPackageInfo, null, mMainThread); 1824 c.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), getDisplayId(), 1825 overrideConfiguration, mResources.getCompatibilityInfo(), mActivityToken); 1826 return c; 1827 } 1828 1829 @Override 1830 public Context createDisplayContext(Display display) { 1831 if (display == null) { 1832 throw new IllegalArgumentException("display must not be null"); 1833 } 1834 1835 int displayId = display.getDisplayId(); 1836 1837 ContextImpl context = new ContextImpl(); 1838 context.init(mPackageInfo, null, mMainThread); 1839 context.mDisplay = display; 1840 DisplayAdjustments daj = getDisplayAdjustments(displayId); 1841 context.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), displayId, 1842 null, daj.getCompatibilityInfo(), null); 1843 return context; 1844 } 1845 1846 private int getDisplayId() { 1847 return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; 1848 } 1849 1850 @Override 1851 public boolean isRestricted() { 1852 return mRestricted; 1853 } 1854 1855 @Override 1856 public DisplayAdjustments getDisplayAdjustments(int displayId) { 1857 return mDisplayAdjustments; 1858 } 1859 1860 private File getDataDirFile() { 1861 if (mPackageInfo != null) { 1862 return mPackageInfo.getDataDirFile(); 1863 } 1864 throw new RuntimeException("Not supported in system context"); 1865 } 1866 1867 @Override 1868 public File getDir(String name, int mode) { 1869 name = "app_" + name; 1870 File file = makeFilename(getDataDirFile(), name); 1871 if (!file.exists()) { 1872 file.mkdir(); 1873 setFilePermissionsFromMode(file.getPath(), mode, 1874 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); 1875 } 1876 return file; 1877 } 1878 1879 /** {@hide} */ 1880 public int getUserId() { 1881 return mUser.getIdentifier(); 1882 } 1883 1884 static ContextImpl createSystemContext(ActivityThread mainThread) { 1885 final ContextImpl context = new ContextImpl(); 1886 context.init(Resources.getSystem(), mainThread, Process.myUserHandle()); 1887 return context; 1888 } 1889 1890 ContextImpl() { 1891 mOuterContext = this; 1892 } 1893 1894 /** 1895 * Create a new ApplicationContext from an existing one. The new one 1896 * works and operates the same as the one it is copying. 1897 * 1898 * @param context Existing application context. 1899 */ 1900 public ContextImpl(ContextImpl context) { 1901 mPackageInfo = context.mPackageInfo; 1902 mBasePackageName = context.mBasePackageName; 1903 mResources = context.mResources; 1904 mMainThread = context.mMainThread; 1905 mContentResolver = context.mContentResolver; 1906 mUser = context.mUser; 1907 mDisplay = context.mDisplay; 1908 mOuterContext = this; 1909 mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo()); 1910 } 1911 1912 final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) { 1913 init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle()); 1914 } 1915 1916 final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, 1917 Resources container, String basePackageName, UserHandle user) { 1918 mPackageInfo = packageInfo; 1919 mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName; 1920 mResources = mPackageInfo.getResources(mainThread); 1921 1922 CompatibilityInfo compatInfo = 1923 container == null ? null : container.getCompatibilityInfo(); 1924 if (mResources != null && 1925 ((compatInfo != null && compatInfo.applicationScale != 1926 mResources.getCompatibilityInfo().applicationScale) 1927 || activityToken != null)) { 1928 if (DEBUG) { 1929 Log.d(TAG, "loaded context has different scaling. Using container's" + 1930 " compatiblity info:" + container.getDisplayMetrics()); 1931 } 1932 if (compatInfo == null) { 1933 compatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; 1934 } 1935 mDisplayAdjustments.setCompatibilityInfo(compatInfo); 1936 mDisplayAdjustments.setActivityToken(activityToken); 1937 mResources = mainThread.getTopLevelResources(mPackageInfo.getResDir(), 1938 Display.DEFAULT_DISPLAY, null, compatInfo, activityToken); 1939 } else { 1940 mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo()); 1941 mDisplayAdjustments.setActivityToken(activityToken); 1942 } 1943 mMainThread = mainThread; 1944 mActivityToken = activityToken; 1945 mContentResolver = new ApplicationContentResolver(this, mainThread, user); 1946 mUser = user; 1947 } 1948 1949 final void init(Resources resources, ActivityThread mainThread, UserHandle user) { 1950 mPackageInfo = null; 1951 mBasePackageName = null; 1952 mResources = resources; 1953 mMainThread = mainThread; 1954 mContentResolver = new ApplicationContentResolver(this, mainThread, user); 1955 mUser = user; 1956 } 1957 1958 final void scheduleFinalCleanup(String who, String what) { 1959 mMainThread.scheduleContextCleanup(this, who, what); 1960 } 1961 1962 final void performFinalCleanup(String who, String what) { 1963 //Log.i(TAG, "Cleanup up context: " + this); 1964 mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); 1965 } 1966 1967 final Context getReceiverRestrictedContext() { 1968 if (mReceiverRestrictedContext != null) { 1969 return mReceiverRestrictedContext; 1970 } 1971 return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); 1972 } 1973 1974 final void setOuterContext(Context context) { 1975 mOuterContext = context; 1976 } 1977 1978 final Context getOuterContext() { 1979 return mOuterContext; 1980 } 1981 1982 final IBinder getActivityToken() { 1983 return mActivityToken; 1984 } 1985 1986 static void setFilePermissionsFromMode(String name, int mode, 1987 int extraPermissions) { 1988 int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR 1989 |FileUtils.S_IRGRP|FileUtils.S_IWGRP 1990 |extraPermissions; 1991 if ((mode&MODE_WORLD_READABLE) != 0) { 1992 perms |= FileUtils.S_IROTH; 1993 } 1994 if ((mode&MODE_WORLD_WRITEABLE) != 0) { 1995 perms |= FileUtils.S_IWOTH; 1996 } 1997 if (DEBUG) { 1998 Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) 1999 + ", perms=0x" + Integer.toHexString(perms)); 2000 } 2001 FileUtils.setPermissions(name, perms, -1, -1); 2002 } 2003 2004 private File validateFilePath(String name, boolean createDirectory) { 2005 File dir; 2006 File f; 2007 2008 if (name.charAt(0) == File.separatorChar) { 2009 String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar)); 2010 dir = new File(dirPath); 2011 name = name.substring(name.lastIndexOf(File.separatorChar)); 2012 f = new File(dir, name); 2013 } else { 2014 dir = getDatabasesDir(); 2015 f = makeFilename(dir, name); 2016 } 2017 2018 if (createDirectory && !dir.isDirectory() && dir.mkdir()) { 2019 FileUtils.setPermissions(dir.getPath(), 2020 FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 2021 -1, -1); 2022 } 2023 2024 return f; 2025 } 2026 2027 private File makeFilename(File base, String name) { 2028 if (name.indexOf(File.separatorChar) < 0) { 2029 return new File(base, name); 2030 } 2031 throw new IllegalArgumentException( 2032 "File " + name + " contains a path separator"); 2033 } 2034 2035 // ---------------------------------------------------------------------- 2036 // ---------------------------------------------------------------------- 2037 // ---------------------------------------------------------------------- 2038 2039 private static final class ApplicationContentResolver extends ContentResolver { 2040 private final ActivityThread mMainThread; 2041 private final UserHandle mUser; 2042 2043 public ApplicationContentResolver( 2044 Context context, ActivityThread mainThread, UserHandle user) { 2045 super(context); 2046 mMainThread = Preconditions.checkNotNull(mainThread); 2047 mUser = Preconditions.checkNotNull(user); 2048 } 2049 2050 @Override 2051 protected IContentProvider acquireProvider(Context context, String auth) { 2052 return mMainThread.acquireProvider(context, auth, mUser.getIdentifier(), true); 2053 } 2054 2055 @Override 2056 protected IContentProvider acquireExistingProvider(Context context, String auth) { 2057 return mMainThread.acquireExistingProvider(context, auth, mUser.getIdentifier(), true); 2058 } 2059 2060 @Override 2061 public boolean releaseProvider(IContentProvider provider) { 2062 return mMainThread.releaseProvider(provider, true); 2063 } 2064 2065 @Override 2066 protected IContentProvider acquireUnstableProvider(Context c, String auth) { 2067 return mMainThread.acquireProvider(c, auth, mUser.getIdentifier(), false); 2068 } 2069 2070 @Override 2071 public boolean releaseUnstableProvider(IContentProvider icp) { 2072 return mMainThread.releaseProvider(icp, false); 2073 } 2074 2075 @Override 2076 public void unstableProviderDied(IContentProvider icp) { 2077 mMainThread.handleUnstableProviderDied(icp.asBinder(), true); 2078 } 2079 } 2080} 2081