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

Commit 3e9e7d5c authored by Grace's avatar Grace
Browse files

Adding Region Sampler to Animatable Clocks

A RegionSamplingHelper is used to extract the color of the wallpaper
behind an AnimatableClockController. This is used to set the color of
the clock to a contrasting hue so that the text is legible. These changes
fixes the problem of the clock text blending into the wallpaper.

Bug: 202758428
Test: atest AnimatableClockControllerTest
Change-Id: I645c2a0b4e68d5ec9165a2eb354f6d814acbf596
parent 75bc6531
Loading
Loading
Loading
Loading
+66 −3
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
import android.icu.text.NumberFormat;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -30,16 +32,24 @@ import androidx.annotation.VisibleForTesting;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.shared.navigationbar.RegionSamplingHelper;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.ViewController;

import java.io.PrintWriter;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.TimeZone;
import java.util.concurrent.Executor;

import javax.inject.Inject;

/**
 * Controller for an AnimatableClockView on the keyguard. Instantiated by
@@ -54,7 +64,10 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final BatteryController mBatteryController;
    private final int mDozingColor = Color.WHITE;
    private Optional<RegionSamplingHelper> mRegionSamplingHelper = Optional.empty();
    private Rect mSamplingBounds = new Rect();
    private int mLockScreenColor;
    private final boolean mRegionSamplingEnabled;

    private boolean mIsDozing;
    private boolean mIsCharging;
@@ -67,13 +80,17 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
    private final float mBurmeseLineSpacing;
    private final float mDefaultLineSpacing;

    @Inject
    public AnimatableClockController(
            AnimatableClockView view,
            StatusBarStateController statusBarStateController,
            BroadcastDispatcher broadcastDispatcher,
            BatteryController batteryController,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            @Main Resources resources
            @Main Resources resources,
            @Main Executor mainExecutor,
            @Background Executor bgExecutor,
            FeatureFlags featureFlags
    ) {
        super(view);
        mStatusBarStateController = statusBarStateController;
@@ -86,6 +103,40 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
                R.dimen.keyguard_clock_line_spacing_scale_burmese);
        mDefaultLineSpacing = resources.getFloat(
                R.dimen.keyguard_clock_line_spacing_scale);

        mRegionSamplingEnabled = featureFlags.isEnabled(Flags.REGION_SAMPLING);
        if (!mRegionSamplingEnabled) {
            return;
        }

        mRegionSamplingHelper = Optional.of(new RegionSamplingHelper(mView,
                new RegionSamplingHelper.SamplingCallback() {
                    @Override
                    public void onRegionDarknessChanged(boolean isRegionDark) {
                        if (isRegionDark) {
                            mLockScreenColor = Color.WHITE;
                        } else {
                            mLockScreenColor = Color.BLACK;
                        }
                        initColors();
                    }

                    @Override
                    public Rect getSampledRegion(View sampledView) {
                        mSamplingBounds = new Rect(sampledView.getLeft(), sampledView.getTop(),
                                sampledView.getRight(), sampledView.getBottom());
                        return mSamplingBounds;
                    }

                    @Override
                    public boolean isSamplingEnabled() {
                        return mRegionSamplingEnabled;
                    }
                }, mainExecutor, bgExecutor)
        );
        mRegionSamplingHelper.ifPresent((regionSamplingHelper) -> {
            regionSamplingHelper.setWindowVisible(true);
        });
    }

    private void reset() {
@@ -169,6 +220,10 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie

        mStatusBarStateController.addCallback(mStatusBarStateListener);

        mRegionSamplingHelper.ifPresent((regionSamplingHelper) -> {
            regionSamplingHelper.start(mSamplingBounds);
        });

        refreshTime();
        initColors();
        mView.animateDoze(mIsDozing, false);
@@ -180,6 +235,9 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
        mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
        mBatteryController.removeCallback(mBatteryCallback);
        mStatusBarStateController.removeCallback(mStatusBarStateListener);
        mRegionSamplingHelper.ifPresent((regionSamplingHelper) -> {
            regionSamplingHelper.stop();
        });
    }

    /** Animate the clock appearance */
@@ -223,8 +281,10 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
    }

    private void initColors() {
        if (!mRegionSamplingEnabled) {
            mLockScreenColor = Utils.getColorAttrDefaultColor(getContext(),
                    com.android.systemui.R.attr.wallpaperTextColorAccent);
        }
        mView.setColors(mDozingColor, mLockScreenColor);
        mView.animateDoze(mIsDozing, false);
    }
@@ -235,5 +295,8 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
    public void dump(@NonNull PrintWriter pw) {
        pw.println(this);
        mView.dump(pw);
        mRegionSamplingHelper.ifPresent((regionSamplingHelper) -> {
            regionSamplingHelper.dump(pw);
        });
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -161,6 +161,11 @@ public class Flags {
    public static final ResourceBooleanFlag MONET =
            new ResourceBooleanFlag(800, R.bool.flag_monet);

    /***************************************/
    // 801 - region sampling
    public static final BooleanFlag REGION_SAMPLING =
            new BooleanFlag(801, false);

    /***************************************/
    // 900 - media
    public static final BooleanFlag MEDIA_TAP_TO_TRANSFER = new BooleanFlag(900, true);
+13 −1
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -53,6 +54,8 @@ import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;

import java.util.concurrent.Executor;

@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -69,6 +72,12 @@ public class AnimatableClockControllerTest extends SysuiTestCase {
    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    @Mock
    private Resources mResources;
    @Mock
    private Executor mMainExecutor;
    @Mock
    private Executor mBgExecutor;
    @Mock
    private FeatureFlags mFeatureFlags;

    private MockitoSession mStaticMockSession;
    private AnimatableClockController mAnimatableClockController;
@@ -96,7 +105,10 @@ public class AnimatableClockControllerTest extends SysuiTestCase {
                mBroadcastDispatcher,
                mBatteryController,
                mKeyguardUpdateMonitor,
                mResources
                mResources,
                mMainExecutor,
                mBgExecutor,
                mFeatureFlags
        );
        mAnimatableClockController.init();
        captureAttachListener();