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

Commit c7a31828 authored by Darryl Johnson's avatar Darryl Johnson Committed by Automerger Merge Worker
Browse files

Merge "Don't override activity display adjustments with app config" into rvc-dev am: ceb2befc

Change-Id: I04aa93179712468a90c07b68ba2c72dc5dda7721
parents e86ae0cb ceb2befc
Loading
Loading
Loading
Loading
+18 −6
Original line number Original line Diff line number Diff line
@@ -1109,10 +1109,16 @@ public class ResourcesManager {
            Slog.v(TAG, "Changing resources "
            Slog.v(TAG, "Changing resources "
                    + resourcesImpl + " config to: " + config);
                    + resourcesImpl + " config to: " + config);
        }
        }
        int displayId = key.mDisplayId;

        final boolean hasOverrideConfiguration = key.hasOverrideConfiguration();
        tmpConfig.setTo(config);
        tmpConfig.setTo(config);


        // Apply the override configuration before setting the display adjustments to ensure that
        // the process config does not override activity display adjustments.
        final boolean hasOverrideConfiguration = key.hasOverrideConfiguration();
        if (hasOverrideConfiguration) {
            tmpConfig.updateFrom(key.mOverrideConfiguration);
        }

        // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update
        // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update
        // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the
        // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the
        // update internally.
        // update internally.
@@ -1121,17 +1127,23 @@ public class ResourcesManager {
            daj = new DisplayAdjustments(daj);
            daj = new DisplayAdjustments(daj);
            daj.setCompatibilityInfo(compat);
            daj.setCompatibilityInfo(compat);
        }
        }

        final int displayId = key.mDisplayId;
        if (displayId == Display.DEFAULT_DISPLAY) {
        if (displayId == Display.DEFAULT_DISPLAY) {
            daj.setConfiguration(config);
            daj.setConfiguration(tmpConfig);
        }
        }
        DisplayMetrics dm = getDisplayMetrics(displayId, daj);
        DisplayMetrics dm = getDisplayMetrics(displayId, daj);
        if (displayId != Display.DEFAULT_DISPLAY) {
        if (displayId != Display.DEFAULT_DISPLAY) {
            applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig);
            applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig);
        }


            // Re-apply the override configuration to ensure that configuration contexts based on
            // a display context (ex: createDisplayContext().createConfigurationContext()) have the
            // correct override.
            if (hasOverrideConfiguration) {
            if (hasOverrideConfiguration) {
                tmpConfig.updateFrom(key.mOverrideConfiguration);
                tmpConfig.updateFrom(key.mOverrideConfiguration);
            }
            }
        }

        resourcesImpl.updateConfiguration(tmpConfig, dm, compat);
        resourcesImpl.updateConfiguration(tmpConfig, dm, compat);
    }
    }


+55 −0
Original line number Original line Diff line number Diff line
@@ -44,8 +44,11 @@ import android.app.servertransaction.StopActivityItem;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager;
import android.os.IBinder;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.MergedConfiguration;
import android.util.MergedConfiguration;
import android.view.Display;
import android.view.Display;
import android.view.View;
import android.view.View;
@@ -366,6 +369,58 @@ public class ActivityThreadTest {
        });
        });
    }
    }


    @Test
    public void testHandleConfigurationChanged_DoesntOverrideActivityConfig() {
        final TestActivity activity = mActivityTestRule.launchActivity(new Intent());

        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
            final Configuration oldActivityConfig =
                    new Configuration(activity.getResources().getConfiguration());
            final DisplayMetrics oldActivityMetrics = new DisplayMetrics();
            activity.getDisplay().getMetrics(oldActivityMetrics);
            final Resources oldAppResources = activity.getApplication().getResources();
            final Configuration oldAppConfig =
                    new Configuration(oldAppResources.getConfiguration());
            final DisplayMetrics oldApplicationMetrics = new DisplayMetrics();
            oldApplicationMetrics.setTo(oldAppResources.getDisplayMetrics());
            assertEquals("Process config must match the top activity config by default",
                    0, oldActivityConfig.diffPublicOnly(oldAppConfig));
            assertEquals("Process config must match the top activity config by default",
                    oldActivityMetrics, oldApplicationMetrics);

            // Update the application configuration separately from activity config
            final Configuration newAppConfig = new Configuration(oldAppConfig);
            newAppConfig.densityDpi += 100;
            newAppConfig.screenHeightDp += 100;
            final Rect newBounds = new Rect(newAppConfig.windowConfiguration.getAppBounds());
            newBounds.bottom += 100;
            newAppConfig.windowConfiguration.setAppBounds(newBounds);
            newAppConfig.windowConfiguration.setBounds(newBounds);
            newAppConfig.seq++;

            final ActivityThread activityThread = activity.getActivityThread();
            activityThread.handleConfigurationChanged(newAppConfig);

            // Verify that application config update was applied, but didn't change activity config.
            assertEquals("Activity config must not change if the process config changes",
                    oldActivityConfig, activity.getResources().getConfiguration());

            final DisplayMetrics newActivityMetrics = new DisplayMetrics();
            activity.getDisplay().getMetrics(newActivityMetrics);
            assertEquals("Activity display size must not change if the process config changes",
                    oldActivityMetrics, newActivityMetrics);
            final Resources newAppResources = activity.getApplication().getResources();
            assertEquals("Application config must be updated",
                    newAppConfig, newAppResources.getConfiguration());
            final DisplayMetrics newApplicationMetrics = new DisplayMetrics();
            newApplicationMetrics.setTo(newAppResources.getDisplayMetrics());
            assertNotEquals("Application display size must be updated after config update",
                    oldApplicationMetrics, newApplicationMetrics);
            assertNotEquals("Application display size must be updated after config update",
                    newActivityMetrics, newApplicationMetrics);
        });
    }

    @Test
    @Test
    public void testResumeAfterNewIntent() {
    public void testResumeAfterNewIntent() {
        final Activity activity = mActivityTestRule.launchActivity(new Intent());
        final Activity activity = mActivityTestRule.launchActivity(new Intent());