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

Commit b7033366 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Fix KeyguardSliceView leak" into rvc-dev am: 68a6d826 am: 01a6a0f0

Change-Id: I056d091656499d80cf4518e7644de4407e06ca54
parents b93a2d15 01a6a0f0
Loading
Loading
Loading
Loading
+20 −10
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import android.annotation.ColorInt;
import android.annotation.StyleRes;
import android.annotation.StyleRes;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.graphics.text.LineBreaker;
import android.graphics.text.LineBreaker;
@@ -40,6 +41,7 @@ import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Log;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.Display;
import android.view.View;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation;
import android.widget.LinearLayout;
import android.widget.LinearLayout;
@@ -62,6 +64,7 @@ import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -90,6 +93,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
    private final ActivityStarter mActivityStarter;
    private final ActivityStarter mActivityStarter;
    private final ConfigurationController mConfigurationController;
    private final ConfigurationController mConfigurationController;
    private final LayoutTransition mLayoutTransition;
    private final LayoutTransition mLayoutTransition;
    private final TunerService mTunerService;
    private Uri mKeyguardSliceUri;
    private Uri mKeyguardSliceUri;
    @VisibleForTesting
    @VisibleForTesting
    TextView mTitle;
    TextView mTitle;
@@ -114,16 +118,14 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe


    @Inject
    @Inject
    public KeyguardSliceView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
    public KeyguardSliceView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
            ActivityStarter activityStarter, ConfigurationController configurationController) {
            ActivityStarter activityStarter, ConfigurationController configurationController,
            TunerService tunerService, @Main Resources resources) {
        super(context, attrs);
        super(context, attrs);


        TunerService tunerService = Dependency.get(TunerService.class);
        mTunerService = tunerService;
        tunerService.addTunable(this, Settings.Secure.KEYGUARD_SLICE_URI);

        mClickActions = new HashMap<>();
        mClickActions = new HashMap<>();
        mRowPadding = context.getResources().getDimensionPixelSize(R.dimen.subtitle_clock_padding);
        mRowPadding = resources.getDimensionPixelSize(R.dimen.subtitle_clock_padding);
        mRowWithHeaderPadding = context.getResources()
        mRowWithHeaderPadding = resources.getDimensionPixelSize(R.dimen.header_subtitle_padding);
                .getDimensionPixelSize(R.dimen.header_subtitle_padding);
        mActivityStarter = activityStarter;
        mActivityStarter = activityStarter;
        mConfigurationController = configurationController;
        mConfigurationController = configurationController;


@@ -143,7 +145,8 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
    // Eventually the existing copy will be reparented instead, and we won't need this.
    // Eventually the existing copy will be reparented instead, and we won't need this.
    public KeyguardSliceView(Context context, AttributeSet attributeSet) {
    public KeyguardSliceView(Context context, AttributeSet attributeSet) {
        this(context, attributeSet, Dependency.get(ActivityStarter.class),
        this(context, attributeSet, Dependency.get(ActivityStarter.class),
                Dependency.get(ConfigurationController.class));
                Dependency.get(ConfigurationController.class), Dependency.get(TunerService.class),
                context.getResources());
    }
    }


    @Override
    @Override
@@ -166,9 +169,15 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
    protected void onAttachedToWindow() {
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        super.onAttachedToWindow();


        mDisplayId = getDisplay().getDisplayId();
        Display display = getDisplay();
        if (display != null) {
            mDisplayId = display.getDisplayId();
        }
        mTunerService.addTunable(this, Settings.Secure.KEYGUARD_SLICE_URI);
        // Make sure we always have the most current slice
        // Make sure we always have the most current slice
        if (mDisplayId == DEFAULT_DISPLAY) {
            mLiveData.observeForever(this);
            mLiveData.observeForever(this);
        }
        mConfigurationController.addCallback(this);
        mConfigurationController.addCallback(this);
    }
    }


@@ -180,6 +189,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
        if (mDisplayId == DEFAULT_DISPLAY) {
        if (mDisplayId == DEFAULT_DISPLAY) {
            mLiveData.removeObserver(this);
            mLiveData.removeObserver(this);
        }
        }
        mTunerService.removeTunable(this);
        mConfigurationController.removeCallback(this);
        mConfigurationController.removeCallback(this);
    }
    }


+56 −6
Original line number Original line Diff line number Diff line
@@ -15,27 +15,38 @@
 */
 */
package com.android.keyguard;
package com.android.keyguard;


import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Color;
import android.net.Uri;
import android.net.Uri;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.View;


import androidx.slice.SliceProvider;
import androidx.slice.SliceProvider;
import androidx.slice.SliceSpecs;
import androidx.slice.SliceSpecs;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.ListBuilder;


import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.tuner.TunerService;


import org.junit.Assert;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;


import java.util.Collections;
import java.util.Collections;
import java.util.HashSet;
import java.util.HashSet;
@@ -48,15 +59,40 @@ public class KeyguardSliceViewTest extends SysuiTestCase {
    private KeyguardSliceView mKeyguardSliceView;
    private KeyguardSliceView mKeyguardSliceView;
    private Uri mSliceUri;
    private Uri mSliceUri;


    @Mock
    private TunerService mTunerService;
    @Mock
    private ConfigurationController mConfigurationController;
    @Mock
    private ActivityStarter mActivityStarter;
    @Mock
    private Resources mResources;

    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        allowTestableLooperAsMainThread();
        allowTestableLooperAsMainThread();
        InjectionInflationController inflationController = new InjectionInflationController(
        LayoutInflater layoutInflater = LayoutInflater.from(getContext());
                SystemUIFactory.getInstance().getRootComponent());
        layoutInflater.setPrivateFactory(new LayoutInflater.Factory2() {
        LayoutInflater layoutInflater = inflationController

                .injectable(LayoutInflater.from(getContext()));
            @Override
            public View onCreateView(View parent, String name, Context context,
                    AttributeSet attrs) {
                return onCreateView(name, context, attrs);
            }

            @Override
            public View onCreateView(String name, Context context, AttributeSet attrs) {
                if ("com.android.keyguard.KeyguardSliceView".equals(name)) {
                    return new KeyguardSliceView(getContext(), attrs, mActivityStarter,
                            mConfigurationController, mTunerService, mResources);
                }
                return null;
            }
        });
        mKeyguardSliceView = (KeyguardSliceView) layoutInflater
        mKeyguardSliceView = (KeyguardSliceView) layoutInflater
                .inflate(R.layout.keyguard_status_area, null);
                .inflate(R.layout.keyguard_status_area, null);
        mKeyguardSliceView.setupUri(KeyguardSliceProvider.KEYGUARD_SLICE_URI);
        mSliceUri = Uri.parse(KeyguardSliceProvider.KEYGUARD_SLICE_URI);
        mSliceUri = Uri.parse(KeyguardSliceProvider.KEYGUARD_SLICE_URI);
        SliceProvider.setSpecs(new HashSet<>(Collections.singletonList(SliceSpecs.LIST)));
        SliceProvider.setSpecs(new HashSet<>(Collections.singletonList(SliceSpecs.LIST)));
    }
    }
@@ -111,4 +147,18 @@ public class KeyguardSliceViewTest extends SysuiTestCase {
        Assert.assertEquals("Should be using AOD text color", Color.WHITE,
        Assert.assertEquals("Should be using AOD text color", Color.WHITE,
                mKeyguardSliceView.getTextColor());
                mKeyguardSliceView.getTextColor());
    }
    }

    @Test
    public void onAttachedToWindow_registersListeners() {
        mKeyguardSliceView.onAttachedToWindow();
        verify(mTunerService).addTunable(eq(mKeyguardSliceView), anyString());
        verify(mConfigurationController).addCallback(eq(mKeyguardSliceView));
    }

    @Test
    public void onDetachedFromWindow_unregistersListeners() {
        mKeyguardSliceView.onDetachedFromWindow();
        verify(mTunerService).removeTunable(eq(mKeyguardSliceView));
        verify(mConfigurationController).removeCallback(eq(mKeyguardSliceView));
    }
}
}