ContextImpl.java revision 224ba0cd065075718947844b117c9fe50a2d9993
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.policy.PolicyManager;
202269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport org.xmlpull.v1.XmlPullParserException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ComponentInfo;
3949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackbornimport android.content.pm.FeatureInfo;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDataObserver;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver;
438946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
4575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.content.pm.IPackageStatsObserver;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
4974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager;
55a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
56a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
62c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
63c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
68c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powellimport android.os.Build;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
70f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
71539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
7675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
7975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils.FileStatus;
83b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
859f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
9175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
93603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
94603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
9587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
96f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
97952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport java.util.Set;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1422155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1432155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1452155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
147569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
149333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
150333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
162870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
170e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
171e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
1725f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
175224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
176224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
177224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
178224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
179224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
180224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ALARM_SERVICE, new StaticServiceFetcher() {
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AlarmManager(service);
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
318224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return InputMethodManager.getInstance(ctx);
324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
332224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LOCATION_SERVICE, new StaticServiceFetcher() {
341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new LocationManager(ILocationManager.Stub.asInterface(b));
344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                                outerContext.getApplicationInfo().targetSdkVersion >=
352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                                    Build.VERSION_CODES.HONEYCOMB
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                                ? com.android.internal.R.style.Theme_Holo_Dialog
354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                                : com.android.internal.R.style.Theme_Dialog),
355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
359224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new PowerManager(service, ctx.mMainThread.getHandler());
366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
367224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
368224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
369224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
370224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SensorManager(ctx.mMainThread.getHandler().getLooper());
377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
384224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
385224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return new StorageManager(ctx.mMainThread.getHandler().getLooper());
388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
403224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
406224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
407224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
408224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
409224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
410224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
411224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new Vibrator();
413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WIFI_SERVICE, new ServiceFetcher() {
418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IWifiManager service = IWifiManager.Stub.asInterface(b);
421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new WifiManager(service, ctx.mMainThread.getHandler());
422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WINDOW_SERVICE, new ServiceFetcher() {
425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return WindowManagerImpl.getDefault();
427224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
428224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
429224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // The system service cache for the system services that are
431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // cached per-ContextImpl.  Package-scoped to avoid accessor
432224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // methods.
433224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
434224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources.getAssets();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4695f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
472eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
473eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4755f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4805f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mThemeResource == 0) {
485170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                final Context outerContext = getOuterContext();
486170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                mThemeResource = (outerContext.getApplicationInfo().targetSdkVersion
487170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                        >= Build.VERSION_CODES.HONEYCOMB)
488170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                                ? com.android.internal.R.style.Theme_Holo
489170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                                : com.android.internal.R.style.Theme;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5125c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
5135c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
5145c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
5155c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
5165c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
5175c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
5185c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
5195c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5345f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
535d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static File makeBackupFile(File prefsFile) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new File(prefsFile.getPath() + ".bak");
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53923ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
54023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
54123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
54223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
5466194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        File prefsFile;
5476194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        boolean needInitialLoad = false;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
549333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
5506194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp != null && !sp.hasFileChangedUnexpectedly()) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sp;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5536194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            prefsFile = getSharedPrefsFile(name);
5546194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
5556194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode, null);
5566194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
5576194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                needInitialLoad = true;
5586194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5616194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        synchronized (sp) {
5626194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (needInitialLoad && sp.isLoaded()) {
5636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                // lost the race to load; another thread handled it
5646194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
5656194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
5666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            File backup = makeBackupFile(prefsFile);
5676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (backup.exists()) {
5686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                prefsFile.delete();
5696194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                backup.renameTo(prefsFile);
5706194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
5715f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5726194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            // Debugging
5736194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (prefsFile.exists() && !prefsFile.canRead()) {
5746194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                Log.w(TAG, "Attempt to read preferences file " + prefsFile + " without permission");
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5776194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            Map map = null;
5786194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (prefsFile.exists() && prefsFile.canRead()) {
5796194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                try {
5806194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    FileInputStream str = new FileInputStream(prefsFile);
5816194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    map = XmlUtils.readMapXml(str);
5826194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    str.close();
583d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick                } catch (XmlPullParserException e) {
5846194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    Log.w(TAG, "getSharedPreferences", e);
5856194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                } catch (FileNotFoundException e) {
5866194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    Log.w(TAG, "getSharedPreferences", e);
5876194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                } catch (IOException e) {
5886194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    Log.w(TAG, "getSharedPreferences", e);
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5916194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            sp.replace(map);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5936194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
6495f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6605f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
662e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
663e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
664e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
665e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
666e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
667e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
668e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
669e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
670e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
671e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
672e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
673e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
674e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
675e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
676e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
677e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
678e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
679e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
680e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
681e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
682e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
683e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
684e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
685e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
686e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
687e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
688e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
689e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
690e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
691e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
6925f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
693e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7125f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
713e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
714e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
715e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
716e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
717e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
718e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
719e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
720e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
721e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
722e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
723e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
724e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
725e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
726e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
727e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
728e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
729e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
730e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
731e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
732e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
733e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7345f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
748a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f = validateFilePath(name, true);
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return db;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
75574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
75674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
75774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
75874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler);
75974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
76074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
76174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
76274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
76374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
766a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return f.delete();
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
775a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7845f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7965f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
7994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8038cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
8044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
8098cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
8148cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
8194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
8244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
8298cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
8416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
8426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            (Activity)null, intent, -1);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
846fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
847fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
848fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
849fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
850fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
851fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
852fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
853fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
854fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
855fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
856fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
857fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        0, flagsMask, flagsValues);
858fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
859fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
860fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
861fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
862fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
863fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
864fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
8655f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
866fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, false);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, false, false);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, true, false);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
91801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true, false);
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, true);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
944efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
945efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
946efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
947efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
948efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
949efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
950efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
951efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
952efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
953efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
954efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
955efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
956efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
957efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
958efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
959efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
960efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
96101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
962efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
963efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
964efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
965efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
966efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
967efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
968efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
969efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
970efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                true, true);
971efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
972efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
973efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
974efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
975efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
101701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1018399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(),
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sd, flags);
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1130224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1131224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11348cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1135224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1138438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1139438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1140438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1141ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1142ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1143ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1144ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1145ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1146ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1147ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1148438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1149438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1150438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkPermission(permission, pid,
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid());
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1290569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, Binder.getCallingUid(), uri, message);
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
13822155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            return new ContextImpl(mMainThread.getSystemContext());
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
138501e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.getPackageInfo(packageName, flags);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
13882155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1389870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1390ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            c.init(pi, null, mMainThread, mResources);
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1401870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1402870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1403870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1404870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1405870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14252155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
14262155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14312155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14412155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
144901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
1451ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        init(packageInfo, activityToken, mainThread, null);
1452ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1453ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
145401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
1455ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
1456ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Resources container) {
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1459ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1460559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1461559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1462559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1463ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1464ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1465ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1466ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1467ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1468ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                    mPackageInfo.getResDir(), container.getCompatibilityInfo().copy());
1469ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15025f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15065f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15105f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1515d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1526569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1533a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1534a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1535a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1536a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1537a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1538a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1539a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1540a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1541a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1542a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1543a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1544a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1545a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1546a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1547a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1548a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1549a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1550a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1551a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1552a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1553a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1554a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1555a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1561a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
1569cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public ApplicationContentResolver(Context context, ActivityThread mainThread) {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1575cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireProvider(Context context, String name) {
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.acquireProvider(context, name);
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1580cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireExistingProvider(Context context, String name) {
1581cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn            return mMainThread.acquireExistingProvider(context, name);
1582cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1583cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1584cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1585cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.releaseProvider(provider);
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1592