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

Commit e1405558 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato Committed by Nicolò Mazzucato
Browse files

Fix clock handling of configuration change

The `Configuration` instance passed to onConfigurationChange was always the same (in most cases), so caching it in the `Clock` class didn't work.

With this we're just caching the field we care about (instead of the entire configuration, which would be cleaner but less efficient), and comparing them one by one.

Bug: 429007403
Flag: com.android.systemui.shade_window_goes_around
Test: change font scale and density with `adb shell settings put system font_scale 2` and check the clock font size changes.
Change-Id: Id6694bdca813a53c5d6a2e35eec29d95d3d3b7c7
parent 92fc94e2
Loading
Loading
Loading
Loading
+92 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 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.systemui.statusbar.policy

import android.content.res.Configuration
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class ClockTest : SysuiTestCase() {

    private lateinit var clock: Clock

    @Before
    fun setUp() {
        clock = Clock(context, null)
    }

    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun onConfigurationChanged_fontScaleChanges_paddingChanges() {
        val initialPadding = clock.paddingLeft

        val newConfig = Configuration(context.resources.configuration)
        newConfig.fontScale += 1.0f

        clock.onConfigurationChanged(newConfig)

        assertThat(clock.paddingLeft).isNotEqualTo(initialPadding)
    }

    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun onConfigurationChanged_densityChanges_paddingChanges() {
        val initialPadding = clock.paddingLeft

        val newConfig = Configuration(context.resources.configuration)
        newConfig.densityDpi += 1

        clock.onConfigurationChanged(newConfig)

        assertThat(clock.paddingLeft).isNotEqualTo(initialPadding)
    }

    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun onConfigurationChanged_nothingChanges_paddingDoesNotChange() {
        val initialPadding = clock.paddingLeft

        val newConfig = Configuration(context.resources.configuration)

        clock.onConfigurationChanged(newConfig)

        assertThat(clock.paddingLeft).isNotEqualTo(initialPadding)
    }

    @Test
    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun onConfigurationChanged_densityChanges_flagOff_paddingDoesNotChange() {
        val initialPadding = clock.paddingLeft

        val newConfig = Configuration(context.resources.configuration)
        newConfig.densityDpi += 1

        clock.onConfigurationChanged(newConfig)

        assertThat(clock.paddingLeft).isEqualTo(initialPadding)
    }
}
+13 −8
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Rect;
@@ -45,6 +46,7 @@ import android.view.View;
import android.widget.TextView;

import com.android.settingslib.Utils;
import com.android.settingslib.applications.InterestingConfigChanges;
import com.android.systemui.Dependency;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -98,7 +100,6 @@ public class Clock extends TextView implements
    private SimpleDateFormat mContentDescriptionFormat;
    private Locale mLocale;
    private DateTimePatternGenerator mDateTimePatternGenerator;
    private Configuration oldConfig = new Configuration();

    private static final int AM_PM_STYLE_NORMAL  = 0;
    private static final int AM_PM_STYLE_SMALL   = 1;
@@ -108,6 +109,8 @@ public class Clock extends TextView implements
    private boolean mShowSeconds;
    private Handler mSecondsHandler;

    // Tracks config changes that will make the clock change dimensions
    private final InterestingConfigChanges mInterestingConfigChanges;
    /**
     * Color to be set on this {@link TextView}, when wallpaperTextColor is <b>not</b> utilized.
     */
@@ -143,6 +146,12 @@ public class Clock extends TextView implements
        }
        mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
        mUserTracker = Dependency.get(UserTracker.class);
        if (ShadeWindowGoesAround.isEnabled()) {
            mInterestingConfigChanges = new InterestingConfigChanges(
                    ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_DENSITY);
        } else {
            mInterestingConfigChanges = null;
        }

        setIncludeFontPadding(false);
    }
@@ -395,18 +404,14 @@ public class Clock extends TextView implements
    protected void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (ShadeWindowGoesAround.isEnabled()) {
            if (densityOrFontScaleChanged(oldConfig, newConfig)) {
            final boolean shouldReloadDimensions =
                    mInterestingConfigChanges.applyNewConfig(newConfig);
            if (shouldReloadDimensions) {
                reloadDimens();
            }
            oldConfig = newConfig;
        }
    }

    private boolean densityOrFontScaleChanged(Configuration oldConfig, Configuration newConfig) {
        return (oldConfig.densityDpi != newConfig.densityDpi)
                || oldConfig.fontScale != newConfig.fontScale;
    }

    private void updateShowSeconds() {
        if (mShowSeconds) {
            // Wait until we have a display to start trying to show seconds.