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

Commit 7ce1093c authored by Julia Tuttle's avatar Julia Tuttle Committed by Android (Google) Code Review
Browse files

Merge changes I268a0710,I4bdaec3b,I8dc2e8d2,I38f26f63,I7b3b7c21, ... into main

* changes:
  Inject SystemClock into HeadsUpManager et al
  Inject GlobalSettings into HeadsUpManager et al
  Use MockitoRule instead of initMocks
  Move constant asserts into static blocks
  Rename HeadsUpManagerTest to match new class name
  Move AlertingNotificationManager constructor after all fields
  Fix some misspelled/confusing names in AlertingNotificationManager
parents 6e80dd6e 32247a09
Loading
Loading
Loading
Loading
+19 −23
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Handler;
import android.os.SystemClock;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.view.accessibility.AccessibilityEvent;
@@ -29,6 +28,7 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.InflationFlag;
import com.android.systemui.statusbar.policy.HeadsUpManagerLogger;
import com.android.systemui.util.time.SystemClock;

import java.util.stream.Stream;

@@ -39,21 +39,23 @@ import java.util.stream.Stream;
 */
public abstract class AlertingNotificationManager {
    private static final String TAG = "AlertNotifManager";
    protected final Clock mClock = new Clock();
    protected final SystemClock mSystemClock;
    protected final ArrayMap<String, AlertEntry> mAlertEntries = new ArrayMap<>();
    protected final HeadsUpManagerLogger mLogger;

    public AlertingNotificationManager(HeadsUpManagerLogger logger, @Main Handler handler) {
        mLogger = logger;
        mHandler = handler;
    }

    protected int mMinimumDisplayTime;
    protected int mStickyDisplayTime;
    protected int mAutoDismissNotificationDecay;
    protected int mStickyForSomeTimeAutoDismissTime;
    protected int mAutoDismissTime;
    @VisibleForTesting
    public Handler mHandler;

    public AlertingNotificationManager(HeadsUpManagerLogger logger, @Main Handler handler,
            SystemClock systemClock) {
        mLogger = logger;
        mHandler = handler;
        mSystemClock = systemClock;
    }

    /**
     * Called when posting a new notification that should alert the user and appear on screen.
     * Adds the notification to be managed.
@@ -251,7 +253,7 @@ public abstract class AlertingNotificationManager {
    public long getEarliestRemovalTime(String key) {
        AlertEntry alerting = mAlertEntries.get(key);
        if (alerting != null) {
            return Math.max(0, alerting.mEarliestRemovaltime - mClock.currentTimeMillis());
            return Math.max(0, alerting.mEarliestRemovalTime - mSystemClock.elapsedRealtime());
        }
        return 0;
    }
@@ -259,7 +261,7 @@ public abstract class AlertingNotificationManager {
    protected class AlertEntry implements Comparable<AlertEntry> {
        @Nullable public NotificationEntry mEntry;
        public long mPostTime;
        public long mEarliestRemovaltime;
        public long mEarliestRemovalTime;

        @Nullable protected Runnable mRemoveAlertRunnable;

@@ -283,8 +285,8 @@ public abstract class AlertingNotificationManager {
        public void updateEntry(boolean updatePostTime, @Nullable String reason) {
            mLogger.logUpdateEntry(mEntry, updatePostTime, reason);

            final long now = mClock.currentTimeMillis();
            mEarliestRemovaltime = now + mMinimumDisplayTime;
            final long now = mSystemClock.elapsedRealtime();
            mEarliestRemovalTime = now + mMinimumDisplayTime;

            if (updatePostTime) {
                mPostTime = Math.max(mPostTime, now);
@@ -318,7 +320,7 @@ public abstract class AlertingNotificationManager {
         * @return true if the notification has been on screen long enough
         */
        public boolean wasShownLongEnough() {
            return mEarliestRemovaltime < mClock.currentTimeMillis();
            return mEarliestRemovalTime < mSystemClock.elapsedRealtime();
        }

        @Override
@@ -351,7 +353,7 @@ public abstract class AlertingNotificationManager {
            if (mRemoveAlertRunnable != null) {
                removeAutoRemovalCallbacks("removeAsSoonAsPossible (will be rescheduled)");

                final long timeLeft = mEarliestRemovaltime - mClock.currentTimeMillis();
                final long timeLeft = mEarliestRemovalTime - mSystemClock.elapsedRealtime();
                mHandler.postDelayed(mRemoveAlertRunnable, timeLeft);
            }
        }
@@ -361,22 +363,16 @@ public abstract class AlertingNotificationManager {
         * @return the post time
         */
        protected long calculatePostTime() {
            return mClock.currentTimeMillis();
            return mSystemClock.elapsedRealtime();
        }

        /**
         * @return When the notification should auto-dismiss itself, based on
         * {@link SystemClock#elapsedRealTime()}
         * {@link SystemClock#elapsedRealtime()}
         */
        protected long calculateFinishTime() {
            // Overridden by HeadsUpManager HeadsUpEntry #calculateFinishTime
            return 0;
        }
    }

    protected final static class Clock {
        public long currentTimeMillis() {
            return SystemClock.elapsedRealtime();
        }
    }
}
+7 −2
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ import com.android.systemui.statusbar.policy.HeadsUpManagerLogger;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.OnHeadsUpPhoneListenerChange;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.time.SystemClock;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -115,11 +117,14 @@ public class HeadsUpManagerPhone extends BaseHeadsUpManager implements OnHeadsUp
            VisualStabilityProvider visualStabilityProvider,
            ConfigurationController configurationController,
            @Main Handler handler,
            GlobalSettings globalSettings,
            SystemClock systemClock,
            AccessibilityManagerWrapper accessibilityManagerWrapper,
            UiEventLogger uiEventLogger,
            JavaAdapter javaAdapter,
            ShadeInteractor shadeInteractor) {
        super(context, logger, handler, accessibilityManagerWrapper, uiEventLogger);
        super(context, logger, handler, globalSettings, systemClock, accessibilityManagerWrapper,
                uiEventLogger);
        Resources resources = mContext.getResources();
        mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time);
        statusBarStateController.addCallback(mStatusBarStateListener);
@@ -206,7 +211,7 @@ public class HeadsUpManagerPhone extends BaseHeadsUpManager implements OnHeadsUp
    @Override
    public boolean shouldSwallowClick(@NonNull String key) {
        BaseHeadsUpManager.HeadsUpEntry entry = getHeadsUpEntry(key);
        return entry != null && mClock.currentTimeMillis() < entry.mPostTime;
        return entry != null && mSystemClock.elapsedRealtime() < entry.mPostTime;
    }

    public void onExpandingFinished() {
+20 −16
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
import android.util.ArrayMap;
import android.view.accessibility.AccessibilityManager;

@@ -40,6 +38,8 @@ import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.InflationFlag;
import com.android.systemui.util.ListenerSet;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.time.SystemClock;

import java.io.PrintWriter;

@@ -85,36 +85,40 @@ public abstract class BaseHeadsUpManager extends AlertingNotificationManager imp
    public BaseHeadsUpManager(@NonNull final Context context,
            HeadsUpManagerLogger logger,
            @Main Handler handler,
            GlobalSettings globalSettings,
            SystemClock systemClock,
            AccessibilityManagerWrapper accessibilityManagerWrapper,
            UiEventLogger uiEventLogger) {
        super(logger, handler);
        super(logger, handler, systemClock);
        mContext = context;
        mAccessibilityMgr = accessibilityManagerWrapper;
        mUiEventLogger = uiEventLogger;
        Resources resources = context.getResources();
        mMinimumDisplayTime = resources.getInteger(R.integer.heads_up_notification_minimum_time);
        mStickyDisplayTime = resources.getInteger(R.integer.sticky_heads_up_notification_time);
        mAutoDismissNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay);
        mStickyForSomeTimeAutoDismissTime = resources.getInteger(
                R.integer.sticky_heads_up_notification_time);
        mAutoDismissTime = resources.getInteger(R.integer.heads_up_notification_decay);
        mTouchAcceptanceDelay = resources.getInteger(R.integer.touch_acceptance_delay);
        mSnoozedPackages = new ArrayMap<>();
        int defaultSnoozeLengthMs =
                resources.getInteger(R.integer.heads_up_default_snooze_length_ms);

        mSnoozeLengthMs = Settings.Global.getInt(context.getContentResolver(),
                SETTING_HEADS_UP_SNOOZE_LENGTH_MS, defaultSnoozeLengthMs);
        mSnoozeLengthMs = globalSettings.getInt(SETTING_HEADS_UP_SNOOZE_LENGTH_MS,
                defaultSnoozeLengthMs);
        ContentObserver settingsObserver = new ContentObserver(handler) {
            @Override
            public void onChange(boolean selfChange) {
                final int packageSnoozeLengthMs = Settings.Global.getInt(
                        context.getContentResolver(), SETTING_HEADS_UP_SNOOZE_LENGTH_MS, -1);
                final int packageSnoozeLengthMs = globalSettings.getInt(
                        SETTING_HEADS_UP_SNOOZE_LENGTH_MS, -1);
                if (packageSnoozeLengthMs > -1 && packageSnoozeLengthMs != mSnoozeLengthMs) {
                    mSnoozeLengthMs = packageSnoozeLengthMs;
                    mLogger.logSnoozeLengthChange(packageSnoozeLengthMs);
                }
            }
        };
        context.getContentResolver().registerContentObserver(
                Settings.Global.getUriFor(SETTING_HEADS_UP_SNOOZE_LENGTH_MS), false,
        globalSettings.registerContentObserver(
                globalSettings.getUriFor(SETTING_HEADS_UP_SNOOZE_LENGTH_MS),
                /* notifyForDescendants = */ false,
                settingsObserver);
    }

@@ -231,7 +235,7 @@ public abstract class BaseHeadsUpManager extends AlertingNotificationManager imp
        final String key = snoozeKey(packageName, mUser);
        Long snoozedUntil = mSnoozedPackages.get(key);
        if (snoozedUntil != null) {
            if (snoozedUntil > mClock.currentTimeMillis()) {
            if (snoozedUntil > mSystemClock.elapsedRealtime()) {
                mLogger.logIsSnoozedReturned(key);
                return true;
            }
@@ -250,7 +254,7 @@ public abstract class BaseHeadsUpManager extends AlertingNotificationManager imp
            String packageName = entry.mEntry.getSbn().getPackageName();
            String snoozeKey = snoozeKey(packageName, mUser);
            mLogger.logPackageSnoozed(snoozeKey);
            mSnoozedPackages.put(snoozeKey, mClock.currentTimeMillis() + mSnoozeLengthMs);
            mSnoozedPackages.put(snoozeKey, mSystemClock.elapsedRealtime() + mSnoozeLengthMs);
        }
    }

@@ -308,7 +312,7 @@ public abstract class BaseHeadsUpManager extends AlertingNotificationManager imp
    protected void dumpInternal(@NonNull PrintWriter pw, @NonNull String[] args) {
        pw.print("  mTouchAcceptanceDelay="); pw.println(mTouchAcceptanceDelay);
        pw.print("  mSnoozeLengthMs="); pw.println(mSnoozeLengthMs);
        pw.print("  now="); pw.println(mClock.currentTimeMillis());
        pw.print("  now="); pw.println(mSystemClock.elapsedRealtime());
        pw.print("  mUser="); pw.println(mUser);
        for (AlertEntry entry: mAlertEntries.values()) {
            pw.print("  HeadsUpEntry="); pw.println(entry.mEntry);
@@ -519,12 +523,12 @@ public abstract class BaseHeadsUpManager extends AlertingNotificationManager imp

        /**
         * @return When the notification should auto-dismiss itself, based on
         * {@link SystemClock#elapsedRealTime()}
         * {@link SystemClock#elapsedRealtime()}
         */
        @Override
        protected long calculateFinishTime() {
            final long duration = getRecommendedHeadsUpTimeoutMs(
                    isStickyForSomeTime() ? mStickyDisplayTime : mAutoDismissNotificationDecay);
                    isStickyForSomeTime() ? mStickyForSomeTimeAutoDismissTime : mAutoDismissTime);

            return mPostTime + duration;
        }
+17 −10
Original line number Diff line number Diff line
@@ -39,12 +39,15 @@ import android.testing.TestableLooper;

import androidx.test.filters.SmallTest;

import com.android.systemui.res.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.HeadsUpManagerLogger;
import com.android.systemui.util.settings.FakeGlobalSettings;
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.util.time.SystemClockImpl;

import org.junit.After;
import org.junit.Before;
@@ -74,18 +77,26 @@ public class AlertingNotificationManagerTest extends SysuiTestCase {
    protected final Runnable mTestTimeoutRunnable = () -> mTimedOut = true;

    protected Handler mTestHandler;
    protected final FakeGlobalSettings mGlobalSettings = new FakeGlobalSettings();
    protected final SystemClock mSystemClock = new SystemClockImpl();
    protected boolean mTimedOut = false;

    @Mock protected ExpandableNotificationRow mRow;

    static {
        assertThat(TEST_MINIMUM_DISPLAY_TIME).isLessThan(TEST_AUTO_DISMISS_TIME);
        assertThat(TEST_AUTO_DISMISS_TIME).isLessThan(TEST_STICKY_AUTO_DISMISS_TIME);
        assertThat(TEST_STICKY_AUTO_DISMISS_TIME).isLessThan(TEST_TIMEOUT_TIME);
    }

    private static class TestableAlertingNotificationManager extends AlertingNotificationManager {
        private AlertEntry mLastCreatedEntry;

        private TestableAlertingNotificationManager(Handler handler) {
            super(new HeadsUpManagerLogger(logcatLogBuffer()), handler);
        private TestableAlertingNotificationManager(Handler handler, SystemClock systemClock) {
            super(new HeadsUpManagerLogger(logcatLogBuffer()), handler, systemClock);
            mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME;
            mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME;
            mStickyDisplayTime = TEST_STICKY_AUTO_DISMISS_TIME;
            mAutoDismissTime = TEST_AUTO_DISMISS_TIME;
            mStickyForSomeTimeAutoDismissTime = TEST_STICKY_AUTO_DISMISS_TIME;
        }

        @Override
@@ -107,7 +118,7 @@ public class AlertingNotificationManagerTest extends SysuiTestCase {
    }

    protected AlertingNotificationManager createAlertingNotificationManager() {
        return new TestableAlertingNotificationManager(mTestHandler);
        return new TestableAlertingNotificationManager(mTestHandler, mSystemClock);
    }

    protected StatusBarNotification createSbn(int id, Notification n) {
@@ -167,10 +178,6 @@ public class AlertingNotificationManagerTest extends SysuiTestCase {
    @Before
    public void setUp() {
        mTestHandler = Handler.createAsync(Looper.myLooper());

        assertThat(TEST_MINIMUM_DISPLAY_TIME).isLessThan(TEST_AUTO_DISMISS_TIME);
        assertThat(TEST_AUTO_DISMISS_TIME).isLessThan(TEST_STICKY_AUTO_DISMISS_TIME);
        assertThat(TEST_STICKY_AUTO_DISMISS_TIME).isLessThan(TEST_TIMEOUT_TIME);
    }

    @After
+9 −1
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.HeadsUpManagerLogger;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.time.SystemClock;

import org.junit.After;
import org.junit.Before;
@@ -87,6 +89,8 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
                KeyguardBypassController keyguardBypassController,
                ConfigurationController configurationController,
                Handler handler,
                GlobalSettings globalSettings,
                SystemClock systemClock,
                AccessibilityManagerWrapper accessibilityManagerWrapper,
                UiEventLogger uiEventLogger,
                JavaAdapter javaAdapter,
@@ -101,13 +105,15 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
                    visualStabilityProvider,
                    configurationController,
                    handler,
                    globalSettings,
                    systemClock,
                    accessibilityManagerWrapper,
                    uiEventLogger,
                    javaAdapter,
                    shadeInteractor
            );
            mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME;
            mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME;
            mAutoDismissTime = TEST_AUTO_DISMISS_TIME;
        }
    }

@@ -121,6 +127,8 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
                mBypassController,
                mConfigurationController,
                mTestHandler,
                mGlobalSettings,
                mSystemClock,
                mAccessibilityManagerWrapper,
                mUiEventLogger,
                mJavaAdapter,
Loading