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

Commit 0daf2102 authored by Filip Gruszczynski's avatar Filip Gruszczynski
Browse files

Fix leaking the first activity while preserving windows.

This is achieved by not having the decor view hold onto the activity
context. Instead, we are wrapping application context, so that we can
have theme support and also have a special instance of window manager
that is aware of the phone window (the same way as activity do).

This reverts commit a5ffea3b.

Change-Id: I924f4c7ef8f0d20e9174bd7b3e00ec00b44443b9
parent 8aefdb48
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -3741,6 +3741,12 @@ public class Activity extends ContextThemeWrapper
        return mMenuInflater;
    }

    @Override
    public void setTheme(int resid) {
        super.setTheme(resid);
        mWindow.setTheme(resid);
    }

    @Override
    protected void onApplyThemeResource(Resources.Theme theme, @StyleRes int resid,
            boolean first) {
+4 −0
Original line number Diff line number Diff line
@@ -2016,4 +2016,8 @@ public abstract class Window {
    public boolean hasNonClientDecorView() {
        return false;
    }

    /** @hide */
    public void setTheme(int resId) {
    }
}
+55 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.policy;

import android.content.Context;
import android.view.ContextThemeWrapper;
import android.view.WindowManager;
import android.view.WindowManagerImpl;

/**
 * Context for decor views which can be seeded with pure application context and not depend on the
 * activity, but still provide some of the facilities that Activity has, e.g. themes.
 *
 * @hide
 */
class DecorContext extends ContextThemeWrapper {
    private PhoneWindow mPhoneWindow;
    private WindowManager mWindowManager;

    public DecorContext(Context context) {
        super(context, null);
    }

    void setPhoneWindow(PhoneWindow phoneWindow) {
        mPhoneWindow = phoneWindow;
        mWindowManager = null;
    }

    @Override
    public Object getSystemService(String name) {
        if (Context.WINDOW_SERVICE.equals(name)) {
            if (mWindowManager == null) {
                WindowManagerImpl wm =
                        (WindowManagerImpl) super.getSystemService(Context.WINDOW_SERVICE);
                mWindowManager = wm.createLocalWindowManager(mPhoneWindow);
            }
            return mWindowManager;
        }
        return super.getSystemService(name);
    }
}
+169 −122

File changed.

Preview size limit exceeded, changes collapsed.