Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07f36c73 authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Add activity token to display system."

parents 066bdcfe 48d0d188
Loading
Loading
Loading
Loading
+47 −37
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.app;

import static android.view.DisplayAdjustments.DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN;

import android.app.backup.BackupAgent;
import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks2;
@@ -75,7 +77,7 @@ import android.util.Log;
import android.util.LogPrinter;
import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.view.CompatibilityInfoHolder;
import android.view.DisplayAdjustments;
import android.view.Display;
import android.view.HardwareRenderer;
import android.view.View;
@@ -209,8 +211,8 @@ public final class ActivityThread {
            = new HashMap<String, WeakReference<LoadedApk>>();
    final HashMap<String, WeakReference<LoadedApk>> mResourcePackages
            = new HashMap<String, WeakReference<LoadedApk>>();
    final HashMap<CompatibilityInfo, DisplayMetrics> mDefaultDisplayMetrics
            = new HashMap<CompatibilityInfo, DisplayMetrics>();
    final HashMap<DisplayAdjustments, DisplayMetrics> mDefaultDisplayMetrics
            = new HashMap<DisplayAdjustments, DisplayMetrics>();
    final HashMap<ResourcesKey, WeakReference<Resources> > mActiveResources
            = new HashMap<ResourcesKey, WeakReference<Resources> >();
    final ArrayList<ActivityClientRecord> mRelaunchingActivities
@@ -1554,6 +1556,7 @@ public final class ActivityThread {
    }

    private class Idler implements MessageQueue.IdleHandler {
        @Override
        public final boolean queueIdle() {
            ActivityClientRecord a = mNewActivities;
            boolean stopProfiling = false;
@@ -1592,6 +1595,7 @@ public final class ActivityThread {
    }

    final class GcIdler implements MessageQueue.IdleHandler {
        @Override
        public final boolean queueIdle() {
            doGcIfNeeded();
            return false;
@@ -1604,8 +1608,10 @@ public final class ActivityThread {
        final private Configuration mOverrideConfiguration;
        final private float mScale;
        final private int mHash;
        final private IBinder mToken;

        ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration, float scale) {
        ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration,
                float scale, IBinder token) {
            mResDir = resDir;
            mDisplayId = displayId;
            if (overrideConfiguration != null) {
@@ -1621,6 +1627,12 @@ public final class ActivityThread {
            hash = 31 * hash + (mOverrideConfiguration != null
                    ? mOverrideConfiguration.hashCode() : 0);
            hash = 31 * hash + Float.floatToIntBits(mScale);
            if (DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN) {
                mToken = token;
                hash = 31 * hash + (mToken == null ? 0 : mToken.hashCode());
            } else {
                mToken = null;
            }
            mHash = hash;
        }

@@ -1693,9 +1705,13 @@ public final class ActivityThread {
        mDefaultDisplayMetrics.clear();
    }

    DisplayMetrics getDisplayMetricsLocked(int displayId, CompatibilityInfo ci) {
    DisplayMetrics getDisplayMetricsLocked(int displayId) {
        return getDisplayMetricsLocked(displayId, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
    }

    DisplayMetrics getDisplayMetricsLocked(int displayId, DisplayAdjustments daj) {
        boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY);
        DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(ci) : null;
        DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(daj) : null;
        if (dm != null) {
            return dm;
        }
@@ -1709,12 +1725,10 @@ public final class ActivityThread {
        }

        if (isDefaultDisplay) {
            mDefaultDisplayMetrics.put(ci, dm);
            mDefaultDisplayMetrics.put(daj, dm);
        }

        CompatibilityInfoHolder cih = new CompatibilityInfoHolder();
        cih.set(ci);
        Display d = displayManager.getCompatibleDisplay(displayId, cih);
        Display d = displayManager.getCompatibleDisplay(displayId, daj);
        if (d != null) {
            d.getMetrics(dm);
        } else {
@@ -1736,7 +1750,7 @@ public final class ActivityThread {
        if (config == null) {
            return null;
        }
        if (compat != null && !compat.supportsScreen()) {
        if (!compat.supportsScreen()) {
            mMainThreadConfig.setTo(config);
            config = mMainThreadConfig;
            compat.applyToConfiguration(displayDensity, config);
@@ -1748,21 +1762,19 @@ public final class ActivityThread {
     * Creates the top level Resources for applications with the given compatibility info.
     *
     * @param resDir the resource directory.
     * @param compInfo the compability info. It will use the default compatibility info when it's
     * null.
     * @param compatInfo the compability info. Must not be null.
     * @param token the application token for determining stack bounds.
     */
    Resources getTopLevelResources(String resDir,
            int displayId, Configuration overrideConfiguration,
            CompatibilityInfo compInfo) {
        ResourcesKey key = new ResourcesKey(resDir,
                displayId, overrideConfiguration,
                compInfo.applicationScale);
    Resources getTopLevelResources(String resDir, int displayId,
            Configuration overrideConfiguration, CompatibilityInfo compatInfo, IBinder token) {
        final float scale = compatInfo.applicationScale;
        ResourcesKey key = new ResourcesKey(resDir, displayId, overrideConfiguration, scale,
                token);
        Resources r;
        synchronized (mPackages) {
            // Resources is app scale dependent.
            if (false) {
                Slog.w(TAG, "getTopLevelResources: " + resDir + " / "
                        + compInfo.applicationScale);
                Slog.w(TAG, "getTopLevelResources: " + resDir + " / " + scale);
            }
            WeakReference<Resources> wr = mActiveResources.get(key);
            r = wr != null ? wr.get() : null;
@@ -1787,7 +1799,7 @@ public final class ActivityThread {
        }

        //Slog.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics);
        DisplayMetrics dm = getDisplayMetricsLocked(displayId, null);
        DisplayMetrics dm = getDisplayMetricsLocked(displayId);
        Configuration config;
        boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY);
        if (!isDefaultDisplay || key.mOverrideConfiguration != null) {
@@ -1801,7 +1813,7 @@ public final class ActivityThread {
        } else {
            config = getConfiguration();
        }
        r = new Resources(assets, dm, config, compInfo);
        r = new Resources(assets, dm, config, compatInfo, token);
        if (false) {
            Slog.i(TAG, "Created app resources " + resDir + " " + r + ": "
                    + r.getConfiguration() + " appScale="
@@ -1831,7 +1843,7 @@ public final class ActivityThread {
            int displayId, Configuration overrideConfiguration,
            LoadedApk pkgInfo) {
        return getTopLevelResources(resDir, displayId, overrideConfiguration,
                pkgInfo.mCompatibilityInfo.get());
                pkgInfo.getCompatibilityInfo(), null);
    }

    final Handler getHandler() {
@@ -2005,10 +2017,8 @@ public final class ActivityThread {
                LoadedApk info = new LoadedApk(this, "android", context, null,
                        CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO);
                context.init(info, null, this);
                context.getResources().updateConfiguration(
                        getConfiguration(), getDisplayMetricsLocked(
                                Display.DEFAULT_DISPLAY,
                                CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO));
                context.getResources().updateConfiguration(getConfiguration(),
                        getDisplayMetricsLocked(Display.DEFAULT_DISPLAY));
                mSystemContext = context;
                //Slog.i(TAG, "Created system resources " + context.getResources()
                //        + ": " + context.getResources().getConfiguration());
@@ -2301,7 +2311,7 @@ public final class ActivityThread {
            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
            for (int displayId : dm.getDisplayIds()) {
                if (displayId != Display.DEFAULT_DISPLAY) {
                    Display display = dm.getRealDisplay(displayId);
                    Display display = dm.getRealDisplay(displayId, r.token);
                    baseContext = appContext.createDisplayContext(display);
                    break;
                }
@@ -3408,11 +3418,11 @@ public final class ActivityThread {
    private void handleUpdatePackageCompatibilityInfo(UpdateCompatibilityData data) {
        LoadedApk apk = peekPackageInfo(data.pkg, false);
        if (apk != null) {
            apk.mCompatibilityInfo.set(data.info);
            apk.setCompatibilityInfo(data.info);
        }
        apk = peekPackageInfo(data.pkg, true);
        if (apk != null) {
            apk.mCompatibilityInfo.set(data.info);
            apk.setCompatibilityInfo(data.info);
        }
        handleConfigurationChanged(mConfiguration, data.info);
        WindowManagerGlobal.getInstance().reportNewConfiguration(mConfiguration);
@@ -3844,8 +3854,9 @@ public final class ActivityThread {
                for (ActivityClientRecord ar : mActivities.values()) {
                    Activity a = ar.activity;
                    if (a != null) {
                        Configuration thisConfig = applyConfigCompatMainThread(mCurDefaultDisplayDpi,
                                newConfig, ar.packageInfo.mCompatibilityInfo.getIfNeeded());
                        Configuration thisConfig = applyConfigCompatMainThread(
                                mCurDefaultDisplayDpi, newConfig,
                                ar.packageInfo.getCompatibilityInfo());
                        if (!ar.activity.mFinished && (allActivities || !ar.paused)) {
                            // If the activity is currently resumed, its configuration
                            // needs to change right now.
@@ -3945,8 +3956,7 @@ public final class ActivityThread {
        }
        int changes = mResConfiguration.updateFrom(config);
        flushDisplayMetricsLocked();
        DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked(
                Display.DEFAULT_DISPLAY, null);
        DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked(Display.DEFAULT_DISPLAY);

        if (compat != null && (mResCompatibilityInfo == null ||
                !mResCompatibilityInfo.equals(compat))) {
@@ -3986,7 +3996,7 @@ public final class ActivityThread {
                    }
                    tmpConfig.setTo(config);
                    if (!isDefaultDisplay) {
                        dm = getDisplayMetricsLocked(displayId, null);
                        dm = getDisplayMetricsLocked(displayId);
                        applyNonDefaultDisplayMetricsToConfigurationLocked(dm, tmpConfig);
                    }
                    if (overrideConfig != null) {
+27 −20
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
import android.view.CompatibilityInfoHolder;
import android.view.DisplayAdjustments;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.WindowManagerImpl;
@@ -205,6 +205,8 @@ class ContextImpl extends Context {

    private static final String[] EMPTY_FILE_LIST = {};

    final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments();

    /**
     * Override this class when the system service constructor needs a
     * ContextImpl.  Else, use StaticServiceFetcher below.
@@ -1830,10 +1832,8 @@ class ContextImpl extends Context {

        ContextImpl c = new ContextImpl();
        c.init(mPackageInfo, null, mMainThread);
        c.mResources = mMainThread.getTopLevelResources(
                mPackageInfo.getResDir(),
                getDisplayId(), overrideConfiguration,
                mResources.getCompatibilityInfo());
        c.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), getDisplayId(),
                overrideConfiguration, mResources.getCompatibilityInfo(), mActivityToken);
        return c;
    }

@@ -1844,17 +1844,13 @@ class ContextImpl extends Context {
        }

        int displayId = display.getDisplayId();
        CompatibilityInfo ci = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
        CompatibilityInfoHolder cih = getCompatibilityInfo(displayId);
        if (cih != null) {
            ci = cih.get();
        }

        ContextImpl context = new ContextImpl();
        context.init(mPackageInfo, null, mMainThread);
        context.mDisplay = display;
        context.mResources = mMainThread.getTopLevelResources(
                mPackageInfo.getResDir(), displayId, null, ci);
        DisplayAdjustments daj = getDisplayAdjustments(displayId);
        context.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), displayId,
                null, daj.getCompatibilityInfo(), null);
        return context;
    }

@@ -1868,8 +1864,8 @@ class ContextImpl extends Context {
    }

    @Override
    public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
        return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
    public DisplayAdjustments getDisplayAdjustments(int displayId) {
        return mDisplayAdjustments;
    }

    private File getDataDirFile() {
@@ -1921,6 +1917,7 @@ class ContextImpl extends Context {
        mUser = context.mUser;
        mDisplay = context.mDisplay;
        mOuterContext = this;
        mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo());
    }

    final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
@@ -1933,16 +1930,26 @@ class ContextImpl extends Context {
        mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
        mResources = mPackageInfo.getResources(mainThread);

        if (mResources != null && container != null
                && container.getCompatibilityInfo().applicationScale !=
                        mResources.getCompatibilityInfo().applicationScale) {
        CompatibilityInfo compatInfo =
                container == null ? null : container.getCompatibilityInfo();
        if (mResources != null &&
                ((compatInfo != null && compatInfo.applicationScale !=
                        mResources.getCompatibilityInfo().applicationScale)
                || activityToken != null)) {
            if (DEBUG) {
                Log.d(TAG, "loaded context has different scaling. Using container's" +
                        " compatiblity info:" + container.getDisplayMetrics());
            }
            mResources = mainThread.getTopLevelResources(
                    mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
                    null, container.getCompatibilityInfo());
            if (compatInfo == null) {
                compatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
            }
            mDisplayAdjustments.setCompatibilityInfo(compatInfo);
            mDisplayAdjustments.setActivityToken(activityToken);
            mResources = mainThread.getTopLevelResources(mPackageInfo.getResDir(),
                    Display.DEFAULT_DISPLAY, null, compatInfo, activityToken);
        } else {
            mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo());
            mDisplayAdjustments.setActivityToken(activityToken);
        }
        mMainThread = mainThread;
        mActivityToken = activityToken;
+13 −5
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ import android.os.Trace;
import android.os.UserHandle;
import android.util.AndroidRuntimeException;
import android.util.Slog;
import android.view.CompatibilityInfoHolder;
import android.view.DisplayAdjustments;
import android.view.Display;

import java.io.File;
@@ -84,7 +84,7 @@ public final class LoadedApk {
    private final ClassLoader mBaseClassLoader;
    private final boolean mSecurityViolation;
    private final boolean mIncludeCode;
    public final CompatibilityInfoHolder mCompatibilityInfo = new CompatibilityInfoHolder();
    private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments();
    Resources mResources;
    private ClassLoader mClassLoader;
    private Application mApplication;
@@ -132,7 +132,7 @@ public final class LoadedApk {
        mBaseClassLoader = baseLoader;
        mSecurityViolation = securityViolation;
        mIncludeCode = includeCode;
        mCompatibilityInfo.set(compatInfo);
        mDisplayAdjustments.setCompatibilityInfo(compatInfo);

        if (mAppDir == null) {
            if (ActivityThread.mSystemContext == null) {
@@ -141,7 +141,7 @@ public final class LoadedApk {
                ActivityThread.mSystemContext.getResources().updateConfiguration(
                         mainThread.getConfiguration(),
                         mainThread.getDisplayMetricsLocked(
                                 Display.DEFAULT_DISPLAY, compatInfo),
                                 Display.DEFAULT_DISPLAY, mDisplayAdjustments),
                         compatInfo);
                //Slog.i(TAG, "Created system resources "
                //        + mSystemContext.getResources() + ": "
@@ -169,7 +169,7 @@ public final class LoadedApk {
        mIncludeCode = true;
        mClassLoader = systemContext.getClassLoader();
        mResources = systemContext.getResources();
        mCompatibilityInfo.set(compatInfo);
        mDisplayAdjustments.setCompatibilityInfo(compatInfo);
    }

    public String getPackageName() {
@@ -184,6 +184,14 @@ public final class LoadedApk {
        return mSecurityViolation;
    }

    public CompatibilityInfo getCompatibilityInfo() {
        return mDisplayAdjustments.getCompatibilityInfo();
    }

    public void setCompatibilityInfo(CompatibilityInfo compatInfo) {
        mDisplayAdjustments.setCompatibilityInfo(compatInfo);
    }

    /**
     * Gets the array of shared libraries that are listed as
     * used by the given package.
+5 −5
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.AttributeSet;
import android.view.CompatibilityInfoHolder;
import android.view.DisplayAdjustments;
import android.view.Display;
import android.view.WindowManager;

@@ -2760,15 +2760,15 @@ public abstract class Context {
    public abstract Context createDisplayContext(Display display);

    /**
     * Gets the compatibility info holder for this context.  This information
     * is provided on a per-application basis and is used to simulate lower density
     * display metrics for legacy applications.
     * Gets the display adjustments holder for this context.  This information
     * is provided on a per-application or activity basis and is used to simulate lower density
     * display metrics for legacy applications and restricted screen sizes.
     *
     * @param displayId The display id for which to get compatibility info.
     * @return The compatibility info holder, or null if not required by the application.
     * @hide
     */
    public abstract CompatibilityInfoHolder getCompatibilityInfo(int displayId);
    public abstract DisplayAdjustments getDisplayAdjustments(int displayId);

    /**
     * Indicates whether this Context is restricted.
+3 −3
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
import android.view.CompatibilityInfoHolder;
import android.view.DisplayAdjustments;
import android.view.Display;

import java.io.File;
@@ -646,7 +646,7 @@ public class ContextWrapper extends Context {

    /** @hide */
    @Override
    public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
        return mBase.getCompatibilityInfo(displayId);
    public DisplayAdjustments getDisplayAdjustments(int displayId) {
        return mBase.getDisplayAdjustments(displayId);
    }
}
Loading