ResourcesManager.java revision 8a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3
188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner/*
288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * Copyright (C) 2013 The Android Open Source Project
388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner *
488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * you may not use this file except in compliance with the License.
688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * You may obtain a copy of the License at
788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner *
888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner *
1088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * Unless required by applicable law or agreed to in writing, software
1188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
1288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * See the License for the specific language governing permissions and
1488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner * limitations under the License.
1588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner */
1688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
1788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerpackage android.app;
1888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
1988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport static android.app.ActivityThread.DEBUG_CONFIGURATION;
2088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
2188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.content.pm.ActivityInfo;
2288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.content.res.AssetManager;
2388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.content.res.CompatibilityInfo;
2488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.content.res.Configuration;
2588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.content.res.Resources;
2688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.content.res.ResourcesKey;
2788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.hardware.display.DisplayManagerGlobal;
2888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.os.IBinder;
2988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.util.ArrayMap;
3088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.util.DisplayMetrics;
3188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.util.Slog;
3288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.view.Display;
3388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport android.view.DisplayAdjustments;
3488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
3588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport java.lang.ref.WeakReference;
3688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerimport java.util.Locale;
3788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
3888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner/** @hide */
3988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautnerpublic class ResourcesManager {
4088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    static final String TAG = "ResourcesManager";
4188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    static final boolean DEBUG_CACHE = false;
4288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    static final boolean DEBUG_STATS = true;
4388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
4488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    private static ResourcesManager sResourcesManager;
45add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn    final ArrayMap<ResourcesKey, WeakReference<Resources> > mActiveResources
46add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn            = new ArrayMap<ResourcesKey, WeakReference<Resources> >();
4788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
4888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    final ArrayMap<DisplayAdjustments, DisplayMetrics> mDefaultDisplayMetrics
4988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            = new ArrayMap<DisplayAdjustments, DisplayMetrics>();
5088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
5188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    CompatibilityInfo mResCompatibilityInfo;
5288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
5388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    Configuration mResConfiguration;
5488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    final Configuration mTmpConfig = new Configuration();
5588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
5688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public static ResourcesManager getInstance() {
5788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        synchronized (ResourcesManager.class) {
5888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (sResourcesManager == null) {
5988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                sResourcesManager = new ResourcesManager();
6088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
6188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return sResourcesManager;
6288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
6388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
6488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
6588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public Configuration getConfiguration() {
6688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        return mResConfiguration;
6788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
6888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
6988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public void flushDisplayMetricsLocked() {
7088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        mDefaultDisplayMetrics.clear();
7188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
7288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
7388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public DisplayMetrics getDisplayMetricsLocked(int displayId) {
7488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        return getDisplayMetricsLocked(displayId, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
7588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
7688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
7788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public DisplayMetrics getDisplayMetricsLocked(int displayId, DisplayAdjustments daj) {
7888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY);
7988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(daj) : null;
8088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (dm != null) {
8188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return dm;
8288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
8388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        dm = new DisplayMetrics();
8488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
8588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        DisplayManagerGlobal displayManager = DisplayManagerGlobal.getInstance();
8688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (displayManager == null) {
8788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // may be null early in system startup
8888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            dm.setToDefaults();
8988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return dm;
9088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
9188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
9288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (isDefaultDisplay) {
9388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            mDefaultDisplayMetrics.put(daj, dm);
9488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
9588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
9688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        Display d = displayManager.getCompatibleDisplay(displayId, daj);
9788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (d != null) {
9888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            d.getMetrics(dm);
9988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        } else {
10088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // Display no longer exists
10188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // FIXME: This would not be a problem if we kept the Display object around
10288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // instead of using the raw display id everywhere.  The Display object caches
10388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // its information even after the display has been removed.
10488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            dm.setToDefaults();
10588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
10688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //Slog.i("foo", "New metrics: w=" + metrics.widthPixels + " h="
10788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //        + metrics.heightPixels + " den=" + metrics.density
10888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //        + " xdpi=" + metrics.xdpi + " ydpi=" + metrics.ydpi);
10988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        return dm;
11088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
11188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
11288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    final void applyNonDefaultDisplayMetricsToConfigurationLocked(
11388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            DisplayMetrics dm, Configuration config) {
11488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
11588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.densityDpi = dm.densityDpi;
11688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.screenWidthDp = (int)(dm.widthPixels / dm.density);
11788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.screenHeightDp = (int)(dm.heightPixels / dm.density);
11888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        int sl = Configuration.resetScreenLayout(config.screenLayout);
11988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (dm.widthPixels > dm.heightPixels) {
12088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            config.orientation = Configuration.ORIENTATION_LANDSCAPE;
12188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            config.screenLayout = Configuration.reduceScreenLayout(sl,
12288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    config.screenWidthDp, config.screenHeightDp);
12388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        } else {
12488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            config.orientation = Configuration.ORIENTATION_PORTRAIT;
12588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            config.screenLayout = Configuration.reduceScreenLayout(sl,
12688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    config.screenHeightDp, config.screenWidthDp);
12788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
12888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.smallestScreenWidthDp = config.screenWidthDp; // assume screen does not rotate
12988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.compatScreenWidthDp = config.screenWidthDp;
13088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.compatScreenHeightDp = config.screenHeightDp;
13188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        config.compatSmallestScreenWidthDp = config.smallestScreenWidthDp;
13288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
13388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
13488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public boolean applyCompatConfiguration(int displayDensity,
13588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            Configuration compatConfiguration) {
13688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (mResCompatibilityInfo != null && !mResCompatibilityInfo.supportsScreen()) {
13788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            mResCompatibilityInfo.applyToConfiguration(displayDensity, compatConfiguration);
13888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return true;
13988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
14088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        return false;
14188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
14288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
14388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    /**
14488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner     * Creates the top level Resources for applications with the given compatibility info.
14588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner     *
14688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner     * @param resDir the resource directory.
147de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski     * @param overlayDirs the resource overlay directories.
148de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski     * @param libDirs the shared library resource dirs this app references.
14988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner     * @param compatInfo the compability info. Must not be null.
15088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner     * @param token the application token for determining stack bounds.
15188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner     */
1528a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey    public Resources getTopLevelResources(String resDir, String[] splitResDirs,
1538a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey            String[] overlayDirs, String[] libDirs, int displayId,
1548a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey            Configuration overrideConfiguration, CompatibilityInfo compatInfo, IBinder token) {
15588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        final float scale = compatInfo.applicationScale;
156de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski        ResourcesKey key = new ResourcesKey(resDir, displayId, overrideConfiguration, scale, token);
15788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        Resources r;
15888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        synchronized (this) {
15988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // Resources is app scale dependent.
16088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (false) {
16188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                Slog.w(TAG, "getTopLevelResources: " + resDir + " / " + scale);
16288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
16388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            WeakReference<Resources> wr = mActiveResources.get(key);
16488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            r = wr != null ? wr.get() : null;
16588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            //if (r != null) Slog.i(TAG, "isUpToDate " + resDir + ": " + r.getAssets().isUpToDate());
16688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (r != null && r.getAssets().isUpToDate()) {
16788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                if (false) {
16888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    Slog.w(TAG, "Returning cached resources " + r + " " + resDir
16988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                            + ": appScale=" + r.getCompatibilityInfo().applicationScale);
17088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                }
17188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                return r;
17288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
17388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
17488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
17588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //if (r != null) {
17688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //    Slog.w(TAG, "Throwing away out-of-date resources!!!! "
17788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //            + r + " " + resDir);
17888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //}
17988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
18088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        AssetManager assets = new AssetManager();
18188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (assets.addAssetPath(resDir) == 0) {
18288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return null;
18388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
18488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
1858a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey        if (splitResDirs != null) {
1868a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey            for (String splitResDir : splitResDirs) {
1878a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                if (assets.addAssetPath(splitResDir) == 0) {
1888a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                    return null;
1898a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                }
1908a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey            }
1918a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey        }
1928a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey
19348d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad        if (overlayDirs != null) {
19448d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad            for (String idmapPath : overlayDirs) {
19548d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad                assets.addOverlayPath(idmapPath);
19648d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad            }
19748d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad        }
19848d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad
199de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski        if (libDirs != null) {
200de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski            for (String libDir : libDirs) {
201de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski                if (assets.addAssetPath(libDir) == 0) {
202de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski                    Slog.w(TAG, "Asset path '" + libDir +
203de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski                            "' does not exist or contains no resources.");
204de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski                }
205de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski            }
206de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski        }
207de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski
20888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //Slog.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics);
20988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        DisplayMetrics dm = getDisplayMetricsLocked(displayId);
21088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        Configuration config;
21188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY);
21288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        final boolean hasOverrideConfig = key.hasOverrideConfiguration();
21388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (!isDefaultDisplay || hasOverrideConfig) {
21488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            config = new Configuration(getConfiguration());
21588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (!isDefaultDisplay) {
21688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                applyNonDefaultDisplayMetricsToConfigurationLocked(dm, config);
21788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
21888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (hasOverrideConfig) {
21988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                config.updateFrom(key.mOverrideConfiguration);
22088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
22188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        } else {
22288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            config = getConfiguration();
22388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
22488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        r = new Resources(assets, dm, config, compatInfo, token);
22588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (false) {
22688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            Slog.i(TAG, "Created app resources " + resDir + " " + r + ": "
22788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    + r.getConfiguration() + " appScale="
22888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    + r.getCompatibilityInfo().applicationScale);
22988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
23088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
23188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        synchronized (this) {
23288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            WeakReference<Resources> wr = mActiveResources.get(key);
23388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            Resources existing = wr != null ? wr.get() : null;
23488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (existing != null && existing.getAssets().isUpToDate()) {
23588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                // Someone else already created the resources while we were
23688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                // unlocked; go ahead and use theirs.
23788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                r.getAssets().close();
23888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                return existing;
23988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
24088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
24188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            // XXX need to remove entries when weak references go away
24288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            mActiveResources.put(key, new WeakReference<Resources>(r));
24388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return r;
24488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
24588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
24688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
24788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    public final boolean applyConfigurationToResourcesLocked(Configuration config,
24888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            CompatibilityInfo compat) {
24988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (mResConfiguration == null) {
25088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            mResConfiguration = new Configuration();
25188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
25288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (!mResConfiguration.isOtherSeqNewer(config) && compat == null) {
25388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Skipping new config: curSeq="
25488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    + mResConfiguration.seq + ", newSeq=" + config.seq);
25588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            return false;
25688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
25788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        int changes = mResConfiguration.updateFrom(config);
25888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        flushDisplayMetricsLocked();
25988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked(Display.DEFAULT_DISPLAY);
26088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
26188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (compat != null && (mResCompatibilityInfo == null ||
26288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                !mResCompatibilityInfo.equals(compat))) {
26388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            mResCompatibilityInfo = compat;
26488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            changes |= ActivityInfo.CONFIG_SCREEN_LAYOUT
26588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    | ActivityInfo.CONFIG_SCREEN_SIZE
26688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
26788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
26888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
26988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        // set it for java, this also affects newly created Resources
27088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        if (config.locale != null) {
27188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            Locale.setDefault(config.locale);
27288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
27388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
27488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        Resources.updateSystemConfiguration(config, defaultDisplayMetrics, compat);
27588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
27688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        ApplicationPackageManager.configurationChanged();
27788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        //Slog.i(TAG, "Configuration changed in " + currentPackageName());
27888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
27988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        Configuration tmpConfig = null;
28088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
281add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn        for (int i=mActiveResources.size()-1; i>=0; i--) {
282add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn            ResourcesKey key = mActiveResources.keyAt(i);
283add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn            Resources r = mActiveResources.valueAt(i).get();
28488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            if (r != null) {
28588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Changing resources "
28688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                        + r + " config to: " + config);
287add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                int displayId = key.mDisplayId;
28888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY);
28988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                DisplayMetrics dm = defaultDisplayMetrics;
290add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                final boolean hasOverrideConfiguration = key.hasOverrideConfiguration();
29188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                if (!isDefaultDisplay || hasOverrideConfiguration) {
29288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    if (tmpConfig == null) {
29388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                        tmpConfig = new Configuration();
29488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    }
29588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    tmpConfig.setTo(config);
29688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    if (!isDefaultDisplay) {
29788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                        dm = getDisplayMetricsLocked(displayId);
29888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                        applyNonDefaultDisplayMetricsToConfigurationLocked(dm, tmpConfig);
29988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    }
30088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    if (hasOverrideConfiguration) {
301add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                        tmpConfig.updateFrom(key.mOverrideConfiguration);
30288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    }
30388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    r.updateConfiguration(tmpConfig, dm, compat);
30488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                } else {
30588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                    r.updateConfiguration(config, dm, compat);
30688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                }
30788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                //Slog.i(TAG, "Updated app resources " + v.getKey()
30888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                //        + " " + r + ": " + r.getConfiguration());
30988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            } else {
31088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner                //Slog.i(TAG, "Removing old resources " + v.getKey());
311add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                mActiveResources.removeAt(i);
31288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner            }
31388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        }
31488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
31588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner        return changes != 0;
31688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner    }
31788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner
31888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner}
319