ResourcesManager.java revision 54130de7d2a0827179acaa35980dbce419cb4fca
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(); 18154130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski // resDir can be null if the 'android' package is creating a new Resources object. 18254130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski // This is fine, since each AssetManager automatically loads the 'android' package 18354130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski // already. 18454130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski if (resDir != null) { 18554130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski if (assets.addAssetPath(resDir) == 0) { 18654130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski return null; 18754130de7d2a0827179acaa35980dbce419cb4fcaAdam Lesinski } 18888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 18988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 1908a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (splitResDirs != null) { 1918a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey for (String splitResDir : splitResDirs) { 1928a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (assets.addAssetPath(splitResDir) == 0) { 1938a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey return null; 1948a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 1958a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 1968a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 1978a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey 19848d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad if (overlayDirs != null) { 19948d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad for (String idmapPath : overlayDirs) { 20048d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad assets.addOverlayPath(idmapPath); 20148d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad } 20248d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad } 20348d22323ce39f9aab003dce74456889b6414af55MÃ¥rten Kongstad 204de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski if (libDirs != null) { 205de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski for (String libDir : libDirs) { 206de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski if (assets.addAssetPath(libDir) == 0) { 207de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski Slog.w(TAG, "Asset path '" + libDir + 208de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski "' does not exist or contains no resources."); 209de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski } 210de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski } 211de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski } 212de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski 21388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner //Slog.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics); 21488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner DisplayMetrics dm = getDisplayMetricsLocked(displayId); 21588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner Configuration config; 21688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); 21788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner final boolean hasOverrideConfig = key.hasOverrideConfiguration(); 21888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (!isDefaultDisplay || hasOverrideConfig) { 21988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner config = new Configuration(getConfiguration()); 22088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (!isDefaultDisplay) { 22188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner applyNonDefaultDisplayMetricsToConfigurationLocked(dm, config); 22288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 22388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (hasOverrideConfig) { 22488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner config.updateFrom(key.mOverrideConfiguration); 22588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 22688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } else { 22788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner config = getConfiguration(); 22888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 22988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner r = new Resources(assets, dm, config, compatInfo, token); 23088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (false) { 23188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner Slog.i(TAG, "Created app resources " + resDir + " " + r + ": " 23288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner + r.getConfiguration() + " appScale=" 23388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner + r.getCompatibilityInfo().applicationScale); 23488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 23588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 23688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner synchronized (this) { 23788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner WeakReference<Resources> wr = mActiveResources.get(key); 23888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner Resources existing = wr != null ? wr.get() : null; 23988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (existing != null && existing.getAssets().isUpToDate()) { 24088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner // Someone else already created the resources while we were 24188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner // unlocked; go ahead and use theirs. 24288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner r.getAssets().close(); 24388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner return existing; 24488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 24588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 24688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner // XXX need to remove entries when weak references go away 24788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner mActiveResources.put(key, new WeakReference<Resources>(r)); 24888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner return r; 24988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 25088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 25188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 25288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner public final boolean applyConfigurationToResourcesLocked(Configuration config, 25388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner CompatibilityInfo compat) { 25488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (mResConfiguration == null) { 25588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner mResConfiguration = new Configuration(); 25688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 25788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (!mResConfiguration.isOtherSeqNewer(config) && compat == null) { 25888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, "Skipping new config: curSeq=" 25988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner + mResConfiguration.seq + ", newSeq=" + config.seq); 26088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner return false; 26188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 26288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner int changes = mResConfiguration.updateFrom(config); 26388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner flushDisplayMetricsLocked(); 26488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked(Display.DEFAULT_DISPLAY); 26588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 26688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (compat != null && (mResCompatibilityInfo == null || 26788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner !mResCompatibilityInfo.equals(compat))) { 26888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner mResCompatibilityInfo = compat; 26988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner changes |= ActivityInfo.CONFIG_SCREEN_LAYOUT 27088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner | ActivityInfo.CONFIG_SCREEN_SIZE 27188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; 27288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 27388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 27488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner // set it for java, this also affects newly created Resources 27588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (config.locale != null) { 27688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner Locale.setDefault(config.locale); 27788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 27888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 27988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner Resources.updateSystemConfiguration(config, defaultDisplayMetrics, compat); 28088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 28188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner ApplicationPackageManager.configurationChanged(); 28288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner //Slog.i(TAG, "Configuration changed in " + currentPackageName()); 28388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 28488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner Configuration tmpConfig = null; 28588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 286add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn for (int i=mActiveResources.size()-1; i>=0; i--) { 287add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn ResourcesKey key = mActiveResources.keyAt(i); 288add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn Resources r = mActiveResources.valueAt(i).get(); 28988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (r != null) { 29088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, "Changing resources " 29188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner + r + " config to: " + config); 292add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn int displayId = key.mDisplayId; 29388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); 29488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner DisplayMetrics dm = defaultDisplayMetrics; 295add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn final boolean hasOverrideConfiguration = key.hasOverrideConfiguration(); 29688c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (!isDefaultDisplay || hasOverrideConfiguration) { 29788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (tmpConfig == null) { 29888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner tmpConfig = new Configuration(); 29988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 30088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner tmpConfig.setTo(config); 30188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (!isDefaultDisplay) { 30288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner dm = getDisplayMetricsLocked(displayId); 30388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner applyNonDefaultDisplayMetricsToConfigurationLocked(dm, tmpConfig); 30488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 30588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner if (hasOverrideConfiguration) { 306add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn tmpConfig.updateFrom(key.mOverrideConfiguration); 30788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 30888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner r.updateConfiguration(tmpConfig, dm, compat); 30988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } else { 31088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner r.updateConfiguration(config, dm, compat); 31188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 31288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner //Slog.i(TAG, "Updated app resources " + v.getKey() 31388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner // + " " + r + ": " + r.getConfiguration()); 31488c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } else { 31588c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner //Slog.i(TAG, "Removing old resources " + v.getKey()); 316add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn mActiveResources.removeAt(i); 31788c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 31888c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 31988c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 32088c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner return changes != 0; 32188c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner } 32288c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner 32388c0589969b17e66559cd2f132094cdaa0ee351dCraig Mautner} 324