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

Commit ae07816a authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix problem with calling onConfigurationChanged() too much.

We now return the initial configuration for a window when it is
added to the window manager.  The view hierarchy would check to
see if it was different than the last one, and not dispatch a
configuration change down itself if not.  However, when
ActivityThread received it, it would always dispatch a config
change even if it is the same.

The solution is to only do this in ActivityThread if the config
is actually different; otherwise, we continue to rely only on
the activity manager explicitly telling us when to do a config
change.

Change-Id: I8a6e3565776dd2723c8b791496bb6041463d4b67
parent ea3e8e07
Loading
Loading
Loading
Loading
+17 −12
Original line number Diff line number Diff line
@@ -3908,16 +3908,16 @@ public final class ActivityThread {
        }
    }

    final void applyConfigurationToResourcesLocked(Configuration config) {
    final boolean applyConfigurationToResourcesLocked(Configuration config) {
        if (mResConfiguration == null) {
            mResConfiguration = new Configuration();
        }
        if (!mResConfiguration.isOtherSeqNewer(config)) {
            if (DEBUG_CONFIGURATION) Log.v(TAG, "Skipping new config: curSeq="
                    + mResConfiguration.seq + ", newSeq=" + config.seq);
            return;
            return false;
        }
        mResConfiguration.updateFrom(config);
        int changes = mResConfiguration.updateFrom(config);
        DisplayMetrics dm = getDisplayMetricsLocked(true);

        // set it for java, this also affects newly created Resources
@@ -3948,6 +3948,8 @@ public final class ActivityThread {
                it.remove();
            }
        }
        
        return changes != 0;
    }
    
    final void handleConfigurationChanged(Configuration config) {
@@ -4522,17 +4524,20 @@ public final class ActivityThread {
        ViewRoot.addConfigCallback(new ComponentCallbacks() {
            public void onConfigurationChanged(Configuration newConfig) {
                synchronized (mPackages) {
                    // We need to apply this change to the resources
                    // immediately, because upon returning the view
                    // hierarchy will be informed about it.
                    if (applyConfigurationToResourcesLocked(newConfig)) {
                        // This actually changed the resources!  Tell
                        // everyone about it.
                        if (mPendingConfiguration == null ||
                                mPendingConfiguration.isOtherSeqNewer(newConfig)) {
                            mPendingConfiguration = newConfig;
                            
                        // We need to apply this change to the resources
                        // immediately, because upon returning the view
                        // hierarchy will be informed about it.
                        applyConfigurationToResourcesLocked(newConfig);
                            queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
                        }
                    }
                }
                queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
            }
            public void onLowMemory() {
            }