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

Commit 04775b0d authored by Austin Wang's avatar Austin Wang Committed by Automerger Merge Worker
Browse files

RESTRICT AUTOMERGE Center align the lock screen wallpaper am: c979b749

parents c2abbca8 c979b749
Loading
Loading
Loading
Loading
+65 −2
Original line number Diff line number Diff line
@@ -26,10 +26,12 @@ import android.annotation.Nullable;
import android.app.Notification;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.hardware.display.DisplayManager;
import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.MediaSession;
@@ -40,6 +42,7 @@ import android.service.notification.NotificationStats;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.widget.ImageView;

@@ -72,11 +75,15 @@ import com.android.systemui.util.concurrency.DelayableExecutor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import dagger.Lazy;

@@ -134,6 +141,14 @@ public class NotificationMediaManager implements Dumpable {
    private BackDropView mBackdrop;
    private ImageView mBackdropFront;
    private ImageView mBackdropBack;
    private final Point mTmpDisplaySize = new Point();

    private final DisplayManager mDisplayManager;
    @Nullable
    private List<String> mSmallerInternalDisplayUids;
    private Display mCurrentDisplay;

    private LockscreenWallpaper.WallpaperDrawable mWallapperDrawable;

    private final MediaController.Callback mMediaListener = new MediaController.Callback() {
        @Override
@@ -179,7 +194,8 @@ public class NotificationMediaManager implements Dumpable {
            StatusBarStateController statusBarStateController,
            SysuiColorExtractor colorExtractor,
            KeyguardStateController keyguardStateController,
            DumpManager dumpManager) {
            DumpManager dumpManager,
            DisplayManager displayManager) {
        mContext = context;
        mMediaArtworkProcessor = mediaArtworkProcessor;
        mKeyguardBypassController = keyguardBypassController;
@@ -195,6 +211,7 @@ public class NotificationMediaManager implements Dumpable {
        mStatusBarStateController = statusBarStateController;
        mColorExtractor = colorExtractor;
        mKeyguardStateController = keyguardStateController;
        mDisplayManager = displayManager;

        setupNotifPipeline();

@@ -470,6 +487,48 @@ public class NotificationMediaManager implements Dumpable {
        mMediaController = null;
    }

    /**
     * Notify lockscreen wallpaper drawable the current internal display.
     */
    public void onDisplayUpdated(Display display) {
        Trace.beginSection("NotificationMediaManager#onDisplayUpdated");
        mCurrentDisplay = display;
        if (mWallapperDrawable != null) {
            mWallapperDrawable.onDisplayUpdated(isOnSmallerInternalDisplays());
        }
        Trace.endSection();
    }

    private boolean isOnSmallerInternalDisplays() {
        if (mSmallerInternalDisplayUids == null) {
            mSmallerInternalDisplayUids = findSmallerInternalDisplayUids();
        }
        return mSmallerInternalDisplayUids.contains(mCurrentDisplay.getUniqueId());
    }

    private List<String> findSmallerInternalDisplayUids() {
        if (mSmallerInternalDisplayUids != null) {
            return mSmallerInternalDisplayUids;
        }
        List<Display> internalDisplays = Arrays.stream(mDisplayManager.getDisplays(
                        DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
                .filter(display -> display.getType() == Display.TYPE_INTERNAL)
                .collect(Collectors.toList());
        if (internalDisplays.isEmpty()) {
            return List.of();
        }
        Display largestDisplay = internalDisplays.stream()
                .max(Comparator.comparingInt(this::getRealDisplayArea))
                .orElse(internalDisplays.get(0));
        internalDisplays.remove(largestDisplay);
        return internalDisplays.stream().map(Display::getUniqueId).collect(Collectors.toList());
    }

    private int getRealDisplayArea(Display display) {
        display.getRealSize(mTmpDisplaySize);
        return mTmpDisplaySize.x * mTmpDisplaySize.y;
    }

    /**
     * Refresh or remove lockscreen artwork from media metadata or the lockscreen wallpaper.
     */
@@ -542,7 +601,7 @@ public class NotificationMediaManager implements Dumpable {
                    mLockscreenWallpaper != null ? mLockscreenWallpaper.getBitmap() : null;
            if (lockWallpaper != null) {
                artworkDrawable = new LockscreenWallpaper.WallpaperDrawable(
                        mBackdropBack.getResources(), lockWallpaper);
                        mBackdropBack.getResources(), lockWallpaper, isOnSmallerInternalDisplays());
                // We're in the SHADE mode on the SIM screen - yet we still need to show
                // the lockscreen wallpaper in that mode.
                allowWhenShade = mStatusBarStateController.getState() == KEYGUARD;
@@ -602,6 +661,10 @@ public class NotificationMediaManager implements Dumpable {
                    mBackdropBack.setBackgroundColor(0xFFFFFFFF);
                    mBackdropBack.setImageDrawable(new ColorDrawable(c));
                } else {
                    if (artworkDrawable instanceof LockscreenWallpaper.WallpaperDrawable) {
                        mWallapperDrawable =
                                (LockscreenWallpaper.WallpaperDrawable) artworkDrawable;
                    }
                    mBackdropBack.setImageDrawable(artworkDrawable);
                }

+5 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.dagger;

import android.app.IActivityManager;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.RemoteException;
import android.service.dreams.IDreamManager;
import android.util.Log;
@@ -139,7 +140,8 @@ public interface CentralSurfacesDependenciesModule {
            StatusBarStateController statusBarStateController,
            SysuiColorExtractor colorExtractor,
            KeyguardStateController keyguardStateController,
            DumpManager dumpManager) {
            DumpManager dumpManager,
            DisplayManager displayManager) {
        return new NotificationMediaManager(
                context,
                centralSurfacesOptionalLazy,
@@ -154,7 +156,8 @@ public interface CentralSurfacesDependenciesModule {
                statusBarStateController,
                colorExtractor,
                keyguardStateController,
                dumpManager);
                dumpManager,
                displayManager);
    }

    /** */
+1 −0
Original line number Diff line number Diff line
@@ -2311,6 +2311,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
    void updateDisplaySize() {
        mDisplay.getMetrics(mDisplayMetrics);
        mDisplay.getSize(mCurrentDisplaySize);
        mMediaManager.onDisplayUpdated(mDisplay);
        if (DEBUG_GESTURES) {
            mGestureRec.tag("display",
                    String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
+30 −6
Original line number Diff line number Diff line
@@ -259,19 +259,25 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen

    /**
     * Drawable that aligns left horizontally and center vertically (like ImageWallpaper).
     *
     * <p>Aligns to the center when showing on the smaller internal display of a multi display
     * device.
     */
    public static class WallpaperDrawable extends DrawableWrapper {

        private final ConstantState mState;
        private final Rect mTmpRect = new Rect();
        private boolean mIsOnSmallerInternalDisplays;

        public WallpaperDrawable(Resources r, Bitmap b) {
            this(r, new ConstantState(b));
        public WallpaperDrawable(Resources r, Bitmap b, boolean isOnSmallerInternalDisplays) {
            this(r, new ConstantState(b), isOnSmallerInternalDisplays);
        }

        private WallpaperDrawable(Resources r, ConstantState state) {
        private WallpaperDrawable(Resources r, ConstantState state,
                boolean isOnSmallerInternalDisplays) {
            super(new BitmapDrawable(r, state.mBackground));
            mState = state;
            mIsOnSmallerInternalDisplays = isOnSmallerInternalDisplays;
        }

        @Override
@@ -310,10 +316,17 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
            }
            dy = (vheight - dheight * scale) * 0.5f;

            int offsetX = 0;
            // Offset to show the center area of the wallpaper on a smaller display for multi
            // display device
            if (mIsOnSmallerInternalDisplays) {
                offsetX = bounds.centerX() - (Math.round(dwidth * scale) / 2);
            }

            mTmpRect.set(
                    bounds.left,
                    bounds.left + offsetX,
                    bounds.top + Math.round(dy),
                    bounds.left + Math.round(dwidth * scale),
                    bounds.left + Math.round(dwidth * scale) + offsetX,
                    bounds.top + Math.round(dheight * scale + dy));

            super.onBoundsChange(mTmpRect);
@@ -324,6 +337,17 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
            return mState;
        }

        /**
         * Update bounds when the hosting display or the display size has changed.
         *
         * @param isOnSmallerInternalDisplays tru if the drawable is on one of the internal displays
         *                                    with the smaller area.
         */
        public void onDisplayUpdated(boolean isOnSmallerInternalDisplays) {
            mIsOnSmallerInternalDisplays = isOnSmallerInternalDisplays;
            onBoundsChange(getBounds());
        }

        static class ConstantState extends Drawable.ConstantState {

            private final Bitmap mBackground;
@@ -339,7 +363,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen

            @Override
            public Drawable newDrawable(@Nullable Resources res) {
                return new WallpaperDrawable(res, this);
                return new WallpaperDrawable(res, this, /* isOnSmallerInternalDisplays= */ false);
            }

            @Override
+48 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.phone

import android.graphics.Bitmap
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidTestingRunner::class)
@SmallTest
class LockscreenWallpaperTest : SysuiTestCase() {

    @Test
    fun testLockscreenWallpaper_onSmallerInternalDisplay_centerAlignsDrawable() {
        val displaySize = Rect(0, 0, 1080, 2092)
        val wallpaperDrawable =
            LockscreenWallpaper.WallpaperDrawable(
                    context.resources,
                    Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888),
                    /* isOnSmallerInternalDisplays= */ false
                )
                .apply { bounds = displaySize }

        wallpaperDrawable.onDisplayUpdated(true)

        assertThat(wallpaperDrawable.drawable.bounds.centerX())
            .isEqualTo(wallpaperDrawable.bounds.centerX())
    }
}