ContextImpl.java revision e2515eebf42c763c0a2d9f873a153711778cfc17
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;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
3974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager;
45c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
46c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
47a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
48a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
54c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
55c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
5950b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
61c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powellimport android.os.Build;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
63f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
64539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
6975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
7275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator;
75b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
779f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
8275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
84603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
85603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
8687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
87f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
88952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1302155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1312155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1332155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
135569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
137333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
138333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14001e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
150870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
158805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    private File mObbDir;
159e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
160e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
1615f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
164224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
165224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
166224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
167224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
168224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
169224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
170224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
171224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
172224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
173224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
174224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
175224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
176224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
177224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
178224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
179224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
180224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ALARM_SERVICE, new StaticServiceFetcher() {
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AlarmManager(service);
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
305d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly        registerService(NFC_SERVICE, new ServiceFetcher() {
306d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                public Object createService(ContextImpl ctx) {
307d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                    return new NfcManager(ctx);
308d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                }});
309d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return InputMethodManager.getInstance(ctx);
318224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
332224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LOCATION_SERVICE, new StaticServiceFetcher() {
335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new LocationManager(ILocationManager.Stub.asInterface(b));
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
345d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                Resources.selectSystemTheme(0,
346d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        outerContext.getApplicationInfo().targetSdkVersion,
347d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Dialog,
348d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Holo_Dialog)),
349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
359224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new PowerManager(service, ctx.mMainThread.getHandler());
360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
367224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
368224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
369224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
370224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SensorManager(ctx.mMainThread.getHandler().getLooper());
371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return new StorageManager(ctx.mMainThread.getHandler().getLooper());
382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
384224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
385224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
403224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4043a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        registerService(USB_SERVICE, new ServiceFetcher() {
4053a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                public Object createService(ContextImpl ctx) {
406e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                    IBinder b = ServiceManager.getService(USB_SERVICE);
4073a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
408e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                }});
409e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
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
482247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    public int getThemeResId() {
483247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn        return mThemeResource;
484247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    }
485247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn
486247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    @Override
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
489d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
490d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                    getOuterContext().getApplicationInfo().targetSdkVersion);
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
53523ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
53623ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
53723ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
53823ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
543333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
5446194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
5454cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                File prefsFile = getSharedPrefsFile(name);
5464cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode);
5476194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
5486194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
5496194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5514e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
5524e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
5534e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // If somebody else (some other process) changed the prefs
5544e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // file behind our back, we reload it.  This has been the
5554e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // historical (if undocumented) behavior.
5564e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            sp.startReloadIfChangedUnexpectedly();
5574e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        }
5586194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
6145f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6255f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
627e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
628e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
629e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
630e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
631e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
632e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
633e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
634e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
635e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
636e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
637e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
638e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
639e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
640e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
641e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
642e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
643e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
644e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
645e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
646e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
647e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
648e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
649e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
650e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
651e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
652e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
653e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
654e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
655e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
656e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
6575f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
658e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
659805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    public File getObbDir() {
660805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        synchronized (mSync) {
661805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            if (mObbDir == null) {
662805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                mObbDir = Environment.getExternalStorageAppObbDirectory(
663805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                        getPackageName());
664805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            }
665805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            return mObbDir;
666805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        }
667805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    }
668805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
669805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    @Override
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
689e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
690e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
691e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
692e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
693e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
694e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
695e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
696e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
697e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
698e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
699e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
700e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
701e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
702e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
703e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
704e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
705e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
706e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
707e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
708e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
709e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7105f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
724a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f = validateFilePath(name, true);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return db;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
73174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
73274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
73374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
73474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler);
73574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
73674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
73774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
73874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
73974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
742a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return f.delete();
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
751a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7605f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7725f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
7754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7798cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
7804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
7858cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
7908cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
7954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
8004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
8058cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
8176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
8186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            (Activity)null, intent, -1);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
822621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
823621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
824621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new AndroidRuntimeException(
825621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    "Calling startActivities() from outside of an Activity "
826621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
827621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " Is this really what you want?");
828621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
829621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mMainThread.getInstrumentation().execStartActivities(
830621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
831621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            (Activity)null, intents);
832621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
833621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
834621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
835fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
836fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
837fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
838fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
839fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
840fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
841fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
842fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
843fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
844fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
845fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
846fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        0, flagsMask, flagsValues);
847fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
848fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
849fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
850fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
851fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
852fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
853fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
8545f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
855fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, false);
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
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, receiverPermission, 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 sendOrderedBroadcast(Intent intent,
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, true, false);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true, false);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, true);
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
933efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
934efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
935efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
936efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
937efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
938efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
939efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
940efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
941efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
942efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
943efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
944efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
945efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
946efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
947efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
948efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
949efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
95001e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
951efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
952efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
953efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
954efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
955efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
956efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
957efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
958efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
959efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                true, true);
960efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
961efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
962efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
963efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
964efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent);
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
100601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1007399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(),
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sd, flags);
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1119224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1120224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11238cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1124224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1127438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1128438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1129438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1130ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1131ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1132ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1133ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1134ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1135ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1136ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1137438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1138438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1139438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkPermission(permission, pid,
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid());
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1279569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, Binder.getCallingUid(), uri, message);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
13712155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            return new ContextImpl(mMainThread.getSystemContext());
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
137401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
1375e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
13772155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1378870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1379ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            c.init(pi, null, mMainThread, mResources);
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1390870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1391870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1392870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1393870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1394870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14142155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
14152155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14202155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14302155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
143801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
1440ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        init(packageInfo, activityToken, mainThread, null);
1441ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1442ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
144301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
1444ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
1445ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Resources container) {
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1448ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1449559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1450559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1451559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1452ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1453ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1454ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1455ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1456ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1457e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    mPackageInfo.getResDir(), container.getCompatibilityInfo());
1458ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14915f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14955f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14995f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1504d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1515569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1522a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1523a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1524a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1525a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1526a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1527a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1528a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1529a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1530a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1531a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1532a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1533a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1534a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1535a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1536a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1537a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1538a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1539a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1540a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1541a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1542a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1543a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1544a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1550a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
1558cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public ApplicationContentResolver(Context context, ActivityThread mainThread) {
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1564cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireProvider(Context context, String name) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.acquireProvider(context, name);
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1569cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireExistingProvider(Context context, String name) {
1570cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn            return mMainThread.acquireExistingProvider(context, name);
1571cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1572cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1573cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1574cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.releaseProvider(provider);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15775f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1581